Introduction
The COVID-19 pandemic, caused by the novel coronavirus SARS-CoV-2,
has had an unprecedented impact on global health, economies, and daily
life since its emergence in late 2019. As the world fights with the
challenges posed by this highly contagious virus, epidemiological data
have been continuously gathered and released to the public, driving
numerous researches and different approaches in trying to understand its
patterns of transmission, to identify vulnerable populations, and to
inform public health strategies. Due to the severity of the early stage
of the pandemic and its wide impact on global production, data of high
quality and accuracy were gathered in the nation through surveys and
reports, so we believed that the COVID-19 data sets could be more
informative and extensive than other epidemiology data.
In this assignment, we looked into the COVID-19 epidemiology data
sets provided by Statistics Canada along with other related data sets.
We attempted to answer three major questions in three subsections:
We wanted to find if there was a possible relationship between
the COVID pandemic and the death counts for 2020, 2021, 2022 and 2023.
Through this question, one might be able to draw insights on whether the
virus has had a dangerous impact on the overall public health.
We gathered data of COVID-19 long term symptom among Canadian
adults. We wanted to draw some conclusions on whether the virus had any
impact on the long-term health condition of Canadians.
We wanted to measure the relationship between the risk prevalence
and some factors like vaccination status, chronic conditions and having
or not a direct contact with people etc. By building a statistical model
between the response and predictors, it helped us understand what
procedures or conditions can affect the prevalence of COVID-19.
Method
Mortality
We used two data sets to explore the relationship between COVID-19
and the mortality in Canada. First data set is focus on the COVID-19
cases and death published by government of Canada to explore the number
of new infections and deaths numbers in Canada and updates every Monday
morning from Feb.01,2020 to Oct.28, 2023.
This first data set published by government of Canada(“COVID-19 Epidemiology Update:summary”
2023), it contains 2940 observations of 23
variables,including the total number of COVID-19 infections and deaths
and their rates from January 2020 until the end of the reporting week,
weekly and bi-weekly number of infection and deaths and their rates.
Additionally, it includes the average daily death counts and rates
derived from both weekly and bi-weekly data. In this section, our
analysis emphasizes variables that pertain to both weekly and overall
data. The data dictionary detailing the selected variables is provided
below.
| Table 2.1.1: COVID-19 Cases and Death Data Dictionary |
| Variables |
Type |
Example |
Number.Unique |
PctMissing |
Comment |
| prname |
character |
British Columbia, Alberta |
15 |
0% |
English name of jurisdiction (province, territory, Canada) |
| date |
character |
2020-02-01, 2020-02-08 |
196 |
0% |
Last day of the epidemiologic week for which the data represent. Epidemiological weeks are from Sunday to Saturday and this date will always fall on a Saturday. |
| reporting_year |
integer |
2020, 2021 |
4 |
0% |
The calendar year associated with the epidemiologic week (based on the Fluwatch weeks calendar) in which the data was reported.(2020-2023) |
| totalcases |
integer |
1, 0 |
2147 |
0% |
The total number of cases reported from January 2020 until the end of the reporting week in a jurisdiction. |
| numtotal_last7 |
numeric |
1, 0 |
1407 |
9.42% |
Total number of cases during the reporting week for a jurisdiction, minus the total number of cases from that jurisdiction's previous week's update. |
| numdeaths |
integer |
0, 1 |
1430 |
0% |
The total number of deaths reported from January 2020 until the end of the reporting week in a jurisdiction. |
| numdeaths_last7 |
numeric |
0, 1 |
295 |
11.02% |
Total number of deaths for a jurisdiction, minus the total number of deaths from that jurisdiction's previous week's update. |
From the Table 2.1.1, we found that the percentage of missing value
in weekly cases and death counts are abound 10%, which is not good for
our research. Missing values are mainly found in the northern and
southeastern provinces and territories, such as Nunavut and Nova Scotia.
In order to avoid the impact of missing values on the study, we use the
total death and infections of COVID-19 in Canada instead of every
province and terrotory in the following discussion.
Second data set is the provisional weekly death counts, by ages and
sex from 2010 to 2023, published by Statistics Canada. This data set
record the 149730 observations of 17 variables that are relevant for
monitoring the impacts of mortality of every province and territory in
Canada. We also deleted some variables which are irrelevant with our
study or can not delivered the useful information in this data set. Such
as variables like STATUS and TERMINATED are missing in all observation
in this data set and variables DECIMALS and UOM_ID are the same for all
variables. The data dictionary for remaining variables is provided
below.
| Table 2.1.2: Weekly Mortality Data Dictionary |
| Variables |
Type |
Example |
Number.Unique |
PctMissing |
Comment |
| REF_DATE |
character |
2010-01-09, 2010-01-16 |
713 |
0% |
Reference period for the series being released.(2010-2023) |
| GEO |
character |
Canada, place of occurrence, Newfoundland and Labrador, place of occurrence |
14 |
0% |
Name of dimension. There can be up to 10 dimensions in a data table.
(i.e. Geography) |
| Age.at.time.of.death |
character |
Age at time of death, all ages, Age at time of death, 0 to 44 years |
5 |
0% |
Age grouo when death occurred |
| Sex |
character |
Both sexes, Males |
3 |
0% |
Sex |
| Characteristics |
character |
Number of deaths |
1 |
0% |
Number of deaths |
| UOM |
character |
Number |
1 |
0% |
The unit of measure applied to a member given in text. |
| VALUE |
integer |
4955, 2535 |
1091 |
9.25% |
Total number of death under certain characteristics |
The total number of death in this data set exist 9.25% missing data
in raw data set, the missing data appears in all data after July 15,
2023. Because we only use the data in Canada with all age group and both
sexes, the missing data only accounted for less than 1% of the data set
we filtered. Therefore, we our study focused on the overall total death
account and the number of COVID-19 deaths in Canada during the period
January 2022 to July 2023.
In order to have better understanding about the mortality in Canada,
we visualize the weekly death counts every year form 2010 to 2023 in
Figure2.1.2, it is clear to see that the the number of annual deaths is
increasing every year. The overall trend from 2010 to 2019 is similar,
with an general decrease from the begging to the middle of the year then
followed by an upward trend until the year end. In the middle of 2020
and the beginning of 2022, there exist two significant spikes on the
figure. These pronounced increases in case counts raise the possibility
that they may be attributed to distinct outbreaks of the epidemic.
To verify this conjecture, we showed the weekly number of death
without the COVID-19 cases in Figure2.1.3. The spikes in 2020 and 2022
are removed but the small spike in mid-2021 still exist. So death counts
rapid increase in 2020 and 2022 may caused by COVID-19 and we will
discuss the probability of COVID-19 deaths in the total number of death
condition on year in the following section.
Long-term Impact
The data of COVID-19 long term symptom among Canadian adults is from
the Canadian COVID-19 Antibody and Health Survey (CCAHS) Cycle2. The
survey collected the data over 3 collection periods between April 2022
and August 2022. The target population for this survey was adults 18
years of age and older living in the 10 provinces across Canada.
Respondents who reported experiencing symptoms at least three months
after a positive COVID-19 test were considered to have long-term
symptoms.(“Long Term COVID-19 Symptoms Among Canadian
Adults” 2023) The long term symptoms data used in this
study has been pre-processed by Statistics Canada. It is grouped by sex
and age groups. The measure is binary response from the respondents. The
value shows the percentage of responses within each specific group. The
confidence intervals are provided in the assessment of point estimates
in case of high variability in the data.
The definition of main variables in the data is shown in following
Table 2.2.1.
| Table 2.2.1: Long Term Symptoms Data Definition |
| Variables |
Type |
Example |
Number.Unique |
PctMissing |
Comment |
| REF_DATE |
integer |
2022 |
1 |
0% |
Reference Year (2022) |
| GEO |
character |
Canada |
1 |
0% |
Geographic Location (Canada) |
| Measures |
character |
Yes, had long-term symptoms, No, did not have long-term symptoms |
2 |
0% |
Does the respondent have the long term symptoms? Yes or No. |
| Sex |
character |
Both sexes, Males |
3 |
0% |
Sex Category |
| Age.group |
character |
Ages 18 and over, Ages 18 to 34 |
5 |
0% |
Age Groups |
| Characteristics |
character |
Percent, Low 95% confidence interval, percent |
3 |
0% |
Characteristics of the value, estimate or confidence interval |
| UOM |
character |
Percent |
1 |
0% |
Unit of Measure (Percentage of the group) |
| VALUE |
numeric |
16, 14.9 |
86 |
0% |
Data Value |
| DECIMALS |
integer |
1 |
1 |
0% |
Number of Decimal Places in Value |
In the study, we dropped variables like “REF_DATE”, “GEO” which
contain the survey information and are the same across the entire data.
A data of current COVID-19 cases in Canada (“Covid-19
Epidemiology Update: Current Situation” 2022) was used
to estimate the missing variables necessary for the test we applied in
later Section 3.2.
Prevalence
Modeling
We used the Canadian COVID-19 Antibody and Health Survey (CCAHS)
Cycle 1 microdata in modeling the prevelance. The CCAHS is collecting
key information relevant to the pandemic to learn as much as possible
about the virus, how it affects overall health, how it spreads, and
whether Canadians are developing antibodies against it. (“Canadian Covid-19 Antibody and Health Survey
(CCAHS)” 2021) The survey contained two parts, an
electronic questionnaire and an at-home blood test. The questionnaire
aimed to get general health and exposure conditions of participants,
whereas the blood test was used to determine the presence of COVID-19
antibodies.
The survey was designed as cross-sectional and was given to
individuals over 1 years old, excluding the population in remote areas
of Canada. The data were sampled randomly from 30 strata created from
each province. Due to the various size of the population of each
stratum, Statistics Canada had to adjust the sample size in those strata
with a larger population and higher proportion of COVID confirmed cases,
ensuring a precise estimate of the prevalence. In addition, a two-stage
sampling method was done at the household level, from which one of the
household members was selected for the survey. In total, a sample size
of 47900 people were selected and about 23.0% responded completely the
survey.
The resulted data contained 10978 number of responses and 99
variables. Due to the large size of the number of variables, we only
selected the ones that we were mostly interested in. We believed that
the selected variables were most likely significant in modeling the
prevalence before attempting to look into the data. After all, a
variable showing if the respondent had a family doctor or not might be
less likely to affect the prevalence than a variable showing the
vaccination status. However, one must note that there might be
predictors that could indirectly affect the response variable. For
example, one could find the variable showing the response to the
following question: “What are the reasons you would not get the COVID-19
vaccine? - Do not consider it necessary to get the vaccine”. This
variable might have influence on the prevalence because no vaccine was
given to the respondent. However, we thought that it was rather less
informative because the information was already reflected in vaccination
status. Therefore, we only chose those variables that can have a direct
impact on the prevalence. Moreover, variables could have invalid
categories like “Valid skip” or “Not stated”. These categories were
present due to regulation and law reinforcement, and the survey is
designed entirely voluntary. Therefore these categories were treated by
us as missing data. Any variable with a high percentage of missing
values (>25%) were dropped.
We gave a data definition in Table 2.3.1 below.
| Table 2.3.1: COVID Status Data Definition |
| Variables |
Type |
Example |
Number.Unique |
PctMissing |
Comment |
| Covid_Status |
factor |
NA, No |
3 |
70.31% |
Had the respondent ever had a positive test result? |
| chronic |
factor |
No, Yes |
3 |
3.1% |
Had the respondent reported having chronic condition? |
| DirectContact |
factor |
Yes, NA |
3 |
20.44% |
In the last six months, had the respondent worked in direct contact with people? |
| Smoke |
factor |
No, NA |
3 |
19.12% |
Does the respondent currently smoke tobacco? |
| WashHand |
factor |
Always, Often |
5 |
0.24% |
Wash hands often? |
| WearMask |
factor |
Always, NA |
5 |
0.6% |
Wear a mask in indoor public spaces where physical distancing is difficult or a mandatory mask by-law exists? |
| Keep2m |
factor |
Often, Always |
5 |
0.4% |
Keep a 2 meter or 6 foot distance from others? |
| AvoidCrowds |
factor |
Often, Always |
5 |
0.9% |
Avoid crowds and large gatherings? |
| FluVac |
factor |
Yes, No |
3 |
0.09% |
In the past 12 months, have you had a seasonal flu vaccine? |
| VaccineStatus |
factor |
No, NA |
3 |
0.17% |
Received at least one vaccine dose against COVID-19? |
| Sex |
factor |
2, 1 |
3 |
0.12% |
Sex: 1 - Male, 2 - Female |
| Age |
factor |
3, 1 |
5 |
0.01% |
Age group: 1-19, 20-39, 40-59, 60 and older |
| NumHouse |
factor |
3, 4 |
5 |
0.77% |
Number of people living in household: 1, 2, 3, and 4 or more |
| AntiBodyResult |
factor |
Negative, Indeterminate |
3 |
0% |
The overall interpretation of the laboratory result is that if 0 of 3 antigen tests was positive, the respondent had an overall negative test for antibodies against SARS-CoV-2, if 1 of 3 antigen tests was positive, the respondent had an overall indeterminate test for antibodies against SARS-CoV-2, and if 2 or more of 3 antigen tests were positive, the respondent had an overall positive test for antibodies against SARS-CoV-2. |
To fully understand the relationship between the response variable
Covid_Status with other predictors, we fitted logistic models in Section
3.3 and provided additional inferences.
Result
Mortality
In order to discuss the probability of COVID-19 death in the total
death, we first calculated the proportion for the COVID-19 death from
2020 to 2023 in Table 3.1.1. To our surprise, the proportion in 2022 is
the higher than the proportion in 2020, 0.0574 and 0.0490 respectively.
This might because the outbreak of the new variant Omicron. The
proportion in 2021 and 2023 are relatively low might because the
population of vaccination increase.
| Table 3.1.1: Contingency table for proportion of COVID-19 death |
| Year |
Covid Death |
Not Covid Death |
| 2020 |
0.0490 |
0.9510 |
| 2021 |
0.0463 |
0.9537 |
| 2022 |
0.0574 |
0.9426 |
| 2023 |
0.0231 |
0.9769 |
To test the homogeneity for COVID-19 death probability condition on
years, we can use the Chi-square test and the null and alternative
hypothesis of homogeneity corresponding to: \[\begin{gather*}
H_0:P_{j|i}\ =\ P_{·j}\\
H_1:P_{j|i}\neq P_{·j}
\end{gather*}\]
| Table3.1.3:Result for test homogeneity between COVID-19 death and Year |
| Test |
Chi-Squared Statistic |
P-Value |
| Chi-squated test |
3107.691 |
< 0.05 |
| Likelihood ratio test |
3538.714 |
< 0.05 |
The Chi-squares statistics computed by Chi-squared test and
Likelihood ratio test is different but the p-value is less than 0.05 in
both test. Thus we reject the null hypothesis under the 0.05 level since
there have strong evidence that exist significant difference in
probability in COVID-19 death probability condition on years.
Then we can compute the relative risk and odds ratio for years to
measure the association between years and COVID-19 death proportion. We
chose the COVID-19 death proportion in 2020 year as baseline category
and compute the relative risks and odds ratios.
| Table 3.1.4: Relative risks for three years |
| Year |
2021 |
2022 |
2023 |
| Relative risk |
0.9449 |
1.1714 |
0.4714 |
Table 3.1.4 showed the Relative risks in 2021,2022 and 2023. We can
see that relative risks in 2021,and 2023 are less than 1, we can
concluded that if a people died in COVID-19, this people is more likely
died in 2020 than 2021 and 2023. The relative risk in 2022 are greater
than 1, we can concluded that if a people died in COVID-19, this people
is more likely died in 2022 than 2020.
| Table 3.1.5: Odds ratio for three years |
| Year |
2021 |
2022 |
2023 |
| Odds Ratio |
1.0613 |
0.8461 |
2.179 |
From Table 3.1.5, we can see that the odds ratios for all three years
are not equal to 1, which indicated that there exists association
between year and COVID-19 death proportion. For odds ratios in 2021 and
2023, there exist positive association between probability of death
caused by COVID-19. The association in 2022 is negative between
proportion of COVID-19 death in total death.
Long-term Impact
As the data of COVID-19 long term symptom among Canadian adults did
not contain the population size and population for each groups. We
estimate the counts from the data of Weekly number of COVID-19 cases in
Canada as of October 28, 2023. From the data of overall COVID-19 cases,
we first grouped the data to the similar structure as our Long Term
Symptom data. The data of other genders was dropped because that the
count is too small comparing to the total population.
The data is first grouped by sex which consists of “males”,
“females”, and “Both sexes”. “Both sexes” group contain the combined
data from both males and females. Then the data is further grouped by
age groups. Subgroup “Ages 18 and over” has the total count for the
corresponding sex group. The proportion table with total count of
subgroups is shown in the Table 3.2.1 below.
| Table 3.2.1:Combined Data Showing Proportions and Counts by Sex and Age |
| Sex |
Age Group |
No, did not have long-term symptoms (Percent) |
Yes, had long-term symptoms (Percent) |
Count |
| Both sexes |
Ages 18 and over |
84.0 |
16.0 |
3959044 |
| Both sexes |
Ages 18 to 34 |
84.6 |
15.4 |
1506093 |
| Both sexes |
Ages 35 to 49 |
84.3 |
15.7 |
657497 |
| Both sexes |
Ages 50 to 64 |
83.3 |
16.7 |
1012269 |
| Both sexes |
Ages 65 and over |
82.2 |
17.8 |
783185 |
| Females |
Ages 18 and over |
79.9 |
20.1 |
2187574 |
| Females |
Ages 18 to 34 |
82.1 |
17.9 |
851700 |
| Females |
Ages 35 to 49 |
80.3 |
19.7 |
376243 |
| Females |
Ages 50 to 64 |
77.8 |
22.2 |
534045 |
| Females |
Ages 65 and over |
75.6 |
24.4 |
425586 |
| Males |
Ages 18 and over |
88.0 |
12.0 |
1771470 |
| Males |
Ages 18 to 34 |
87.0 |
13.0 |
654393 |
| Males |
Ages 35 to 49 |
88.3 |
11.7 |
281254 |
| Males |
Ages 50 to 64 |
88.9 |
11.1 |
478224 |
| Males |
Ages 65 and over |
89.2 |
10.8 |
357599 |
From the Table 3.2.1, we find that for females, higher
proportion(24.4%) of respondents from age 65 and over reported long term
symptoms. While males from ages 18 to 34 show a higher proportion(13%)
to report long term symptoms. Overall(both sexes), higher
proportion(17.8%) of adults from ages 65 and over reported long term
symptoms. For all age groups, 20.1% of females reported long term
symptoms comparing to only 12% of males.
To study the association between age groups and the long term
symptoms, A Chi-square test was conducted within each sex group. The
hypothesis of independence corresponds to \(H_0:p_{ij}=p_{i\cdot}p_{\cdot j}, \forall
i,j\). Under each sex group, a \(4\times2\) contingency is constructed. We
have age groups as the row variable , response of long term symptoms as
the column variable. Counts for specific responses “Yes, had long-term
symptoms” and “No, did not have long-term symptoms” are estimated using
the corresponding proportion and the total counts of each subgroup.
A similar Chi-square test was applied to test the association between
sex and the long term symptoms. Under each age group, a \(2\times2\) contingency table is constructed
with sex as the row variable and long term symptoms as the column
variable.
Test results are shown in the following table.
| Table 3.2.2: Chi-Squared Test Results of Age groups and Long term symptoms |
| Sex |
Chi-Squared Statistic |
P-Value |
| Males |
1,470.535 |
< 0.05 |
| Females |
8,591.285 |
< 0.05 |
| Both sexes |
2,477.967 |
< 0.05 |
Table 3.2.2 shows the results of Chi-squared tests comparing the
Occurrence of long-term COVID-19 symptoms across different age groups
within each sex category and for both sexes combined.For all categories
(Males, Females, and Both Sexes), the Chi-squared statistics are high,
and the p-values are less than 0.05.This suggests that within each of
these categories, there is a statistically significant association
between age group and the occurrence of long-term COVID-19 symptoms. The
differences in symptom frequencies across age groups are not likely to
be due to random chance.
| Table 3.2.3: Chi-Squared Test Results of Sex and Long term symptoms |
| Age Group |
Chi-Squared Statistic |
P-Value |
| Ages 18 and over |
46,667.640 |
< 0.05 |
| Ages 18 to 34 |
6,688.341 |
< 0.05 |
| Ages 35 to 49 |
7,557.410 |
< 0.05 |
| Ages 50 to 64 |
22,075.403 |
< 0.05 |
| Ages 65 and over |
24,150.716 |
< 0.05 |
Table 3.2.3 presents the results of Chi-squared tests comparing the
occurrence of long-term COVID-19 symptoms between males and females
within each age group.Each age group shows a very high Chi-squared
statistic with all p-values being less than 0.05. These results indicate
a statistically significant association between sex and the occurrence
of long-term COVID-19 symptoms in each age group.
To further explore the strength of the association. We calculated
odds ratios primarily between males and females in each age group. For
each age group, the odds of females experiencing long-term symptoms are
compared to the odds for males. An OR greater than 1 indicates a higher
likelihood for females. The results are shown in Table 3.2.4.
| Table 3.2.4: Odds Ratios of Long-term COVID-19 Symptoms: Females vs Males by Age Group |
| Age Group |
Odds Ratio |
| Ages 18 and over |
1.845 |
| Ages 18 to 34 |
1.459 |
| Ages 35 to 49 |
1.851 |
| Ages 50 to 64 |
2.285 |
| Ages 65 and over |
2.666 |
Across all age groups, females are consistently more likely than
males to report long-term COVID-19 symptoms, as indicated by odds ratios
greater than 1 in each category. The odds ratios seem to increase with
age. The highest disparity between females and males is observed in the
oldest age group (Ages 65 and over).
Prevalence
Modeling
The hypothesis we were mostly interested in was:
\[\begin{gather*}
H_0: \beta_j = 0 \\
H_0: \beta_j \neq 0
\end{gather*}\]
for each coefficient related to its corresponding covariate. In other
words, we wanted to describe the relationship between the COVID status
of a participant and other predictors. We selected the model with the
least AIC value shown in Table 3.3.1.
| Table 3.3.1: Complete List of Models For COVID Status Estimation |
| Intercept |
AntiBodyResult |
VaccineStatus |
DirectContact |
FluVac |
chronic |
NumHouse |
Smoke |
Sex |
Age |
WashHand |
AvoidCrowds |
Keep2m |
WearMask |
logLikelihood |
AIC |
| 1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-353.1412 |
706.2824 |
| 1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-187.0380 |
378.0760 |
| 1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-138.9752 |
283.9504 |
| 1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-137.4942 |
282.9884 |
| 1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-136.4851 |
282.9702 |
| 1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-135.6459 |
283.2917 |
| 1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-133.1663 |
284.3326 |
| 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
-133.0229 |
286.0457 |
| 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
-132.9915 |
287.9831 |
| 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
-131.5871 |
291.1742 |
| 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
-130.5807 |
295.1614 |
| 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
-130.0206 |
300.0412 |
| 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
-129.6772 |
305.3545 |
| 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
-129.5168 |
311.0336 |
Our best model had the following coefficients shown in the summary
Table 3.3.2, from which we found that the variable FluVac that indicated
whether or not the participant had a flu shot for the past 12 months had
a p-value = 0.155 not significant enough, so we did not have a
conclusion on whether the variable was associated with the response.
Table 3.3.2: Summary of Model with Lowest AIC
=======================================================
Dependent variable:
---------------------------
Covid_Status
-------------------------------------------------------
DirectContactYes -0.706*
(0.364)*
p = 0.053
FluVacYes -0.507
(0.356)
p = 0.155
VaccineStatusYes -4.244***
(0.768)***
p = 0.00000
AntiBodyResultIndeterminate 3.414***
(0.503)***
p = 0.000
AntiBodyResultPositive 6.617***
(0.441)***
p = 0.000
Constant -4.959***
(0.429)***
p = 0.000
-------------------------------------------------------
Observations 2,372
Log Likelihood -136.485
Akaike Inf. Crit. 284.970
=======================================================
Note: *p<0.1; **p<0.05; ***p<0.01
We looked at the AIC when the flu vaccine status variable was
removed. One can see in Table 3.3.3 below that there was not much
difference in the AIC value. For model simplicity we therefore omitted
the variable.
| Table 3.3.3: Model AIC Comparison with FluVac Removed |
| chronic |
DirectContact |
Smoke |
WashHand |
WearMask |
Keep2m |
AvoidCrowds |
FluVac |
VaccineStatus |
Sex |
Age |
NumHouse |
AntiBodyResult |
Criterion |
| FALSE |
TRUE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
TRUE |
TRUE |
FALSE |
FALSE |
FALSE |
TRUE |
282.9702 |
| FALSE |
TRUE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
TRUE |
FALSE |
FALSE |
FALSE |
TRUE |
282.9884 |
Similarly, from summary Table 3.3.2 above we found that the variable
DirectContact that showed whether the participant had directed contact
with people or not also had an unpromising p-value=0.053. After removing
the FluVac variable first, we compared the models with and without
DirectContact variable using the deviance. From the following summary
Table 3.3.4 one can see that the p-value of the Chi-squared statistic
was 0.085, suggesting again that we did not have a conclusion whether or
not there was an association between the COVID status and having direct
contact with people.
Table 3.3.4: Validation of DirectContact Variable
================================================================
Resid. Df Resid. Dev Df Deviance Pr(> Chi)
----------------------------------------------------------------
1 2,367 274.988
2 2,368 277.950 -1 -2.962 0.085
----------------------------------------------------------------
Model 1: y ~ DirectContact + VaccineStatus + AntiBodyResult
Model 2: y ~ VaccineStatus + AntiBodyResult
We again dropped the variable DirectContact because the AIC didn’t
change significantly after removal:
| Table 3.3.5: Model AIC Comparison with DirectContact Removed |
| Intercept |
chronic |
DirectContact |
Smoke |
WashHand |
WearMask |
Keep2m |
AvoidCrowds |
FluVac |
VaccineStatus |
Sex |
Age |
NumHouse |
AntiBodyResult |
logLikelihood |
AIC |
| TRUE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
TRUE |
FALSE |
FALSE |
FALSE |
TRUE |
-138.9752 |
283.9504 |
| TRUE |
FALSE |
TRUE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
TRUE |
FALSE |
FALSE |
FALSE |
TRUE |
-137.4942 |
282.9884 |
Therefore, we concluded that our model was: \[\begin{equation*}
\ln{(\frac{p_i}{1-p_i})} = -5.565 -4.568 \times
\text{VaccineStatusYes}_i +3.392 \times
\text{AntiBodyResultIndeterminate}_i +6.602 \times
\text{AntiBodyResultPositive}_i
\end{equation*}\]
from the following summary Table 3.3.6:
Table 3.3.6: Summary of Final Model
=======================================================
Dependent variable:
---------------------------
Covid_Status
-------------------------------------------------------
VaccineStatusYes -4.568***
(0.759)***
p = 0.000
AntiBodyResultIndeterminate 3.392***
(0.499)***
p = 0.000
AntiBodyResultPositive 6.602***
(0.432)***
p = 0.000
Constant -5.565***
(0.354)***
p = 0.000
-------------------------------------------------------
Observations 2,372
Log Likelihood -138.975
Akaike Inf. Crit. 285.950
=======================================================
Note: *p<0.1; **p<0.05; ***p<0.01
We further did another model estimation for the COVID status and some
preventative behaviours like washing hands, wearing masks, keep 2 metres
and avoiding crowds. The result in summary Table 3.3.7 showed that only
washing hands often an always were significant enough to be negatively
related to the COVID status whereas all other covariates were
inconclusive.
Table 3.3.7: Model Estimates of COVID Status with Preventative Behaviours
===================================================
Dependent variable:
---------------------------
Covid_Status
---------------------------------------------------
WashHandOccasionally -2.282*
(1.368)*
p = 0.096
WashHandOften -2.921**
(1.345)**
p = 0.030
WashHandAlways -2.704**
(1.345)**
p = 0.045
WearMaskOccasionally 11.313
(508.697)
p = 0.983
WearMaskOften 11.687
(508.696)
p = 0.982
WearMaskAlways 11.391
(508.696)
p = 0.983
Keep2mOccasionally -0.534
(1.162)
p = 0.646
Keep2mOften -0.705
(1.141)
p = 0.537
Keep2mAlways -0.558
(1.142)
p = 0.625
AvoidCrowdsOccasionally -1.526*
(0.902)*
p = 0.091
AvoidCrowdsOften -1.057
(0.699)
p = 0.131
AvoidCrowdsAlways -0.807
(0.684)
p = 0.238
Constant -10.291
(508.699)
p = 0.984
---------------------------------------------------
Observations 3,202
Log Likelihood -559.450
Akaike Inf. Crit. 1,144.899
===================================================
Note: *p<0.1; **p<0.05; ***p<0.01
Discussion
Mortality
From Section 3.1, we found that the probability of death caused by
COVID-19 is not homogeneous across years, then we computed the relative
risks and odds ratios for 2021,2022 and 2023. We observed that relative
risk in 2022 (RR = 1.1714) indicates a higher risk compared to the 2020,
while relative risk in 2021 (RR = 0.9449) suggests a slightly lower
risk. Notably, relative risk in 2023 (RR = 0.4714) stands out with a
significantly lower risk, suggesting a potential protective effect. The
odds ratio in 2023 (OR = 2.179) stands out, indicating a significantly
higher odds compared to the odds in 2020. In contrast, odds ratio in
2022 (OR = 0.8461) suggests a lower odds, while odds ratio in 2021 (OR =
1.0613) demonstrates a subtle increase.
The lower risk and higher odds in 2021 and 2023 might because the
widespread vaccination in Canada. Public Health Ontario states(“Comparison of COVID-19 Hospitalizations and
Deaths in 2022 and 2021” 2023) that over 70.2% of
Ontario residents received at least one dose of COVID-19 vaccine in the
full year 2021, over 60% completed two doses vaccination. Also, the
vaccine still has high vaccine effectiveness against variants of concern
Alpha and delta. Till October 2023, 80.5% people in total population in
Canada completed their primary series vaccination, over 4 million people
received booster dose Pfizer-BioNTech Comirnaty vaccine(“COVID-19
Vaccination:vaccination Coverage” 2023). The public
health restrictions and mandatory masking policies dropped, there has
also been a shift from the young to the old, with more than 80% of
deaths occurring in patients over 65 years old with comorbidities(“2022
Was the Deadliest Year of the COVID-19 Pandemic in b.c. What’s
Next?” 2022).
Long-term Impact
Based on the results from section 3.2, The Chi-squared tests revealed
statistically significant associations between age groups and the
occurrence of long-term COVID-19 symptoms within each sex category and
between sexes within each age group. The Odds Ratios consistently showed
that females are more likely than males to report long-term COVID-19
symptoms in all age groups.This disparity in the likelihood of symptoms
appears to increase with age, with the oldest age group (Ages 65 and
over) showing the highest Odds Ratio.
Our findings resonate with several clinical studies that have
suggested gender difference in the impact of long_COVID-19
syndrome.Specifically, the higher likelihood of long-term symptoms in
females is consistent with public health researches that women might
experience COVID-19 differently than men.(Bai et al. 2021)
However our study is based on aggregated data focusing primarily on the
association of sex and age with long-term COVID-19 symptoms. While this
provides valuable insights, the data does not include individual patient
states that could influence the findings. Moreover, The nature of the
data and the analytical methods used (Chi-squared tests and Odds Ratios)
are effective for identifying associations but do not establish
causation.
Further studies involving more detailed data should aim to uncover
the biological, social, and behavioral mechanisms driving the observed
gender differences in long-term COVID-19 symptoms. Some study(Juszko et al. 2022) suggests that
psychological factors also have correlation in both women and men with
self-reported health after COVID-19. The study clearly indicates a
significant gender disparity in the mental health impact of COVID-19
during the recuperation period.
Prevalence
Modeling
From Section 3.3 we have found that the odds ratio of COVID-19 was
related to two covariates: the vaccination status and the antibody
presented in blood. Specifically, we interpreted the coefficients as the
log-odds for its corresponding covariate.
\[
\ln{OR}=\beta_j, \quad OR:=\frac{p_2(1-p_1)}{p_1(1-p_2)}
\]
In other words, \(e^{\beta_j}\) is
the marginal increase/decrease in the odds for a on-unit
increase/decrease in the covariate, assuming all other covariates held
constant. On the other hand, the constant coefficient \(\beta_0\) is interpreted as the log-odds
\(\ln{(\frac{p_1}{1-p_1})}\) with all
covariates unchanged. From our summary Table 3.3.6 one can see that the
coefficient for the vaccine status was negative, indicating that the
odds of having a positive COVID test decreases if vaccine was given.
This result wasn’t surprising that the use of vaccines has so far helped
the humanity combat this virus. The coefficient for the indeterminate
antibody result was positive, and the one for the positive antibody
result was even higher. We must point out that one needs to carefully
interpret this result. It meant that the odds of getting a positive
COVID test is positively correlated with the result of an antibody test.
The more positive the antibody test is, the higher the odds of having a
positive COVID test as well. However, antibody test and the COVID-19
diagnostic test are not the same thing in the explainations provided by
FDA (“Antibody (Serology) Testing for
Covid-19” 2023). The antibody test does not detect the
virus. Rather, it merely tells if a person may have had a PRIOR
infection, thus it does not reflect if the person is currently infected
or not. In addition, the antibody test could show if a person has been
vaccinated or not, but in general an antibody test may not detect the
kind of antibodies created by vaccines, therefore it depends on the type
of antibody test performed. From our result we were only able to say
that there was a positive relationship between the COVID diagnostic test
and the antibody test, which was not surprising because in order to show
positive in an antibody test, one must have had COVID to begin with.
This information may be useful, for example, that one of the tests is
economically more affordable and can be used as a preliminary screening
method.
From the second model fitting for preventative behaviours, we found
that only washing hand was showing a negative effect on the odds of
getting COVID. We weren’t able to draw any conclusion for other
preventative behaviours, but we thought it was inevitably hard to find a
relationship between the COVID status and those behaviours because
people may not answer the questionnaire accurately. People might find
difficult to distinguish the boundary between wearing mask often and
always. People can even falsely answer that they keep a distance of 2
metres or more but in reality they have not done so. The resulting
answers for the survey therefore may not be as reliable. Thus we thought
it is generally difficult to accurately describe the relationship
between prevalence of disease and preventative behaviour. Researchers
have to design experiments and find ways to quantify the behaviour in
order to have more reliable outcomes.
Conclusion
In Mortality section, we found that there exist significant
difference in probability of death caused by COVID-19 across years. 2022
has the relative risk greater than 1 and odds ratio less than 1, which
indicate the negative association, indicating an decreased likelihood of
the in probability in COVID-19 death in these years.Given the change in
the demographic of the affected population, it is essential to
acknowledge the possibility that the rise in mortality among older
individuals in the later stages of the epidemic could be attributed to
complications rather than the direct impact of COVID-19 itself. In
future research, it would be valuable to explore the influence of
complications on the death after infections.
we can conclude that there is a significant association between age
and gender with the occurrence of long-term COVID-19 symptoms. Notably,
females across all age groups, especially those aged 65 and over, are
more likely to report these symptoms compared to males.However, it’s
important to recognize that our study, while highlighting crucial
associations, does not delve into the causal mechanisms due to its
reliance on aggregated data. This limitation underscores the need for
further research with more comprehensive data to explore the underlying
biological, social, and psychological factors contributing to these
observed differences in long-term COVID-19 symptoms.
We found in Prevalence Modeling section that the COVID status is
negatively associated with the vaccination status, indicating that
vaccines was a significant factor to lower the prevalence of the virus.
We also found but not surprising that the antibody test result was
positively related to the COVID status. In addition, we did confirm that
washing hands can result in a negative influence on the prevalence of
COVID, but we could not find the same conclusion for other preventative
behaviours.
LS0tCnRpdGxlOiAiTUFUNTMxNyBDYXRlZ29yaWNhbCBBc3NpZ25tZW50IDIiCmF1dGhvcjoKLSBUZW5nIExpKDczNzMwODYpCi0gWmhpemUgTHUoMzAwMDc1MTE0KQotIENodXRvbmcgWmhhbmcoMzAwMzExMzI1KQpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICBmaWdfY2FwdGlvbjogeWVzCmhlYWRlci1pbmNsdWRlczoKLSBccmVuZXdjb21tYW5ke1xhbmR9e1xcfQotIFx1c2VwYWNrYWdle2Zsb2F0fQotIFxmbG9hdHBsYWNlbWVudHtmaWd1cmV9e0h9CmJpYmxpb2dyYXBoeTogUmVmZXJlbmNlcy5iaWIKbGluay1jaXRhdGlvbnM6IHllcwotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci50aXRsZSwgLmF1dGhvcnt0ZXh0LWFsaWduOiBjZW50ZXI7fQpib2R5e2ZvbnQtc2l6ZTogMTJwdDt9CnRhYmxle2ZvbnQtc2l6ZTogMTJwdDt9Cmgxe2ZvbnQtc2l6ZTogMTRwdDt9Cmgye2ZvbnQtc2l6ZTogMTJwdDt9Cjwvc3R5bGU+CgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGJlc3RnbG0pCmxpYnJhcnkoZ3QpCmxpYnJhcnkoc3RhcmdhemVyKQpsaWJyYXJ5KERlc2NUb29scykKYGBgCgpgYGB7cn0KQ0NBSFM8LXJlYWQuY3N2KCJDQ0FIUy5jc3YiLCBoZWFkZXIgPSBUUlVFKQpDb3ZpZDwtcmVhZC5jc3YoIkNvdmlkLmNzdiIsIGhlYWRlciA9IFRSVUUpCkNvdmlkX2FHPC1yZWFkLmNzdigiQ09WSURfQWdlR2VuZGVyLmNzdiIsIGhlYWRlciA9IFRSVUUpCldNb3J0YWxpdHk8LXJlYWQuY3N2KCJXZWVrbHlNb3J0YWxpdHkuY3N2IiwgaGVhZGVyID0gVFJVRSkKRXhNb3J0YWxpdHk8LXJlYWQuY3N2KCJFeGNlc3NNb3J0YWxpdHkuY3N2IiwgaGVhZGVyID0gVFJVRSkKTG9uZ1Rlcm08LXJlYWQuY3N2KCJMb25nVGVybS5jc3YiLCBoZWFkZXIgPSBUUlVFKQpgYGAKCiMgSW50cm9kdWN0aW9uCgpUaGUgQ09WSUQtMTkgcGFuZGVtaWMsIGNhdXNlZCBieSB0aGUgbm92ZWwgY29yb25hdmlydXMgU0FSUy1Db1YtMiwgaGFzIGhhZCBhbiB1bnByZWNlZGVudGVkIGltcGFjdCBvbiBnbG9iYWwgaGVhbHRoLCBlY29ub21pZXMsIGFuZCBkYWlseSBsaWZlIHNpbmNlIGl0cyBlbWVyZ2VuY2UgaW4gbGF0ZSAyMDE5LiBBcyB0aGUgd29ybGQgZmlnaHRzIHdpdGggdGhlIGNoYWxsZW5nZXMgcG9zZWQgYnkgdGhpcyBoaWdobHkgY29udGFnaW91cyB2aXJ1cywgZXBpZGVtaW9sb2dpY2FsIGRhdGEgaGF2ZSBiZWVuIGNvbnRpbnVvdXNseSBnYXRoZXJlZCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYywgZHJpdmluZyBudW1lcm91cyByZXNlYXJjaGVzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBpbiB0cnlpbmcgdG8gdW5kZXJzdGFuZCBpdHMgcGF0dGVybnMgb2YgdHJhbnNtaXNzaW9uLCB0byBpZGVudGlmeSB2dWxuZXJhYmxlIHBvcHVsYXRpb25zLCBhbmQgdG8gaW5mb3JtIHB1YmxpYyBoZWFsdGggc3RyYXRlZ2llcy4gRHVlIHRvIHRoZSBzZXZlcml0eSBvZiB0aGUgZWFybHkgc3RhZ2Ugb2YgdGhlIHBhbmRlbWljIGFuZCBpdHMgd2lkZSBpbXBhY3Qgb24gZ2xvYmFsIHByb2R1Y3Rpb24sIGRhdGEgb2YgaGlnaCBxdWFsaXR5IGFuZCBhY2N1cmFjeSB3ZXJlIGdhdGhlcmVkIGluIHRoZSBuYXRpb24gdGhyb3VnaCBzdXJ2ZXlzIGFuZCByZXBvcnRzLCBzbyB3ZSBiZWxpZXZlZCB0aGF0IHRoZSBDT1ZJRC0xOSBkYXRhIHNldHMgY291bGQgYmUgbW9yZSBpbmZvcm1hdGl2ZSBhbmQgZXh0ZW5zaXZlIHRoYW4gb3RoZXIgZXBpZGVtaW9sb2d5IGRhdGEuCgpJbiB0aGlzIGFzc2lnbm1lbnQsIHdlIGxvb2tlZCBpbnRvIHRoZSBDT1ZJRC0xOSBlcGlkZW1pb2xvZ3kgZGF0YSBzZXRzIHByb3ZpZGVkIGJ5IFN0YXRpc3RpY3MgQ2FuYWRhIGFsb25nIHdpdGggb3RoZXIgcmVsYXRlZCBkYXRhIHNldHMuIFdlIGF0dGVtcHRlZCB0byBhbnN3ZXIgdGhyZWUgbWFqb3IgcXVlc3Rpb25zIGluIHRocmVlIHN1YnNlY3Rpb25zOgoKMS4gV2Ugd2FudGVkIHRvIGZpbmQgaWYgdGhlcmUgd2FzIGEgcG9zc2libGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIENPVklEIHBhbmRlbWljIGFuZCB0aGUgZGVhdGggY291bnRzIGZvciAyMDIwLCAyMDIxLCAyMDIyIGFuZCAyMDIzLiBUaHJvdWdoIHRoaXMgcXVlc3Rpb24sIG9uZSBtaWdodCBiZSBhYmxlIHRvIGRyYXcgaW5zaWdodHMgb24gd2hldGhlciB0aGUgdmlydXMgaGFzIGhhZCBhIGRhbmdlcm91cyBpbXBhY3Qgb24gdGhlIG92ZXJhbGwgcHVibGljIGhlYWx0aC4KCjIuIFdlIGdhdGhlcmVkIGRhdGEgb2YgQ09WSUQtMTkgbG9uZyB0ZXJtIHN5bXB0b20gYW1vbmcgQ2FuYWRpYW4gYWR1bHRzLiBXZSB3YW50ZWQgdG8gZHJhdyBzb21lIGNvbmNsdXNpb25zIG9uIHdoZXRoZXIgdGhlIHZpcnVzIGhhZCBhbnkgaW1wYWN0IG9uIHRoZSBsb25nLXRlcm0gaGVhbHRoIGNvbmRpdGlvbiBvZiBDYW5hZGlhbnMuCgozLiBXZSB3YW50ZWQgdG8gbWVhc3VyZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHJpc2sgcHJldmFsZW5jZSBhbmQgc29tZSBmYWN0b3JzIGxpa2UgdmFjY2luYXRpb24gc3RhdHVzLCBjaHJvbmljIGNvbmRpdGlvbnMgYW5kIGhhdmluZyBvciBub3QgYSBkaXJlY3QgY29udGFjdCB3aXRoIHBlb3BsZSBldGMuIEJ5IGJ1aWxkaW5nIGEgc3RhdGlzdGljYWwgbW9kZWwgYmV0d2VlbiB0aGUgcmVzcG9uc2UgYW5kIHByZWRpY3RvcnMsIGl0IGhlbHBlZCB1cyB1bmRlcnN0YW5kIHdoYXQgcHJvY2VkdXJlcyBvciBjb25kaXRpb25zIGNhbiBhZmZlY3QgdGhlIHByZXZhbGVuY2Ugb2YgQ09WSUQtMTkuICAKCiMgTWV0aG9kCgojIyBNb3J0YWxpdHkKV2UgdXNlZCB0d28gZGF0YSBzZXRzIHRvIGV4cGxvcmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIENPVklELTE5IGFuZCB0aGUgbW9ydGFsaXR5IGluIENhbmFkYS4gRmlyc3QgZGF0YSBzZXQgaXMgZm9jdXMgb24gdGhlIENPVklELTE5IGNhc2VzIGFuZCBkZWF0aCBwdWJsaXNoZWQgYnkgZ292ZXJubWVudCBvZiBDYW5hZGEgdG8gZXhwbG9yZSB0aGUgbnVtYmVyIG9mIG5ldyBpbmZlY3Rpb25zIGFuZCBkZWF0aHMgbnVtYmVycyBpbiBDYW5hZGEgYW5kIHVwZGF0ZXMgZXZlcnkgTW9uZGF5IG1vcm5pbmcgZnJvbSBGZWIuMDHvvIwyMDIwIHRvIE9jdC4yOCwgMjAyMy4gCgpUaGlzIGZpcnN0IGRhdGEgc2V0IHB1Ymxpc2hlZCBieSBnb3Zlcm5tZW50IG9mIENhbmFkYVtAR09DXSwgaXQgY29udGFpbnMgMjk0MCBvYnNlcnZhdGlvbnMgb2YgMjMgdmFyaWFibGVzLGluY2x1ZGluZyB0aGUgdG90YWwgbnVtYmVyIG9mIENPVklELTE5IGluZmVjdGlvbnMgYW5kIGRlYXRocyBhbmQgdGhlaXIgcmF0ZXMgZnJvbSBKYW51YXJ5IDIwMjAgdW50aWwgdGhlIGVuZCBvZiB0aGUgcmVwb3J0aW5nIHdlZWssIHdlZWtseSBhbmQgYmktd2Vla2x5IG51bWJlciBvZiBpbmZlY3Rpb24gYW5kIGRlYXRocyBhbmQgdGhlaXIgcmF0ZXMuIEFkZGl0aW9uYWxseSwgaXQgaW5jbHVkZXMgdGhlIGF2ZXJhZ2UgZGFpbHkgZGVhdGggY291bnRzIGFuZCByYXRlcyBkZXJpdmVkIGZyb20gYm90aCB3ZWVrbHkgYW5kIGJpLXdlZWtseSBkYXRhLiBJbiB0aGlzIHNlY3Rpb24sIG91ciBhbmFseXNpcyBlbXBoYXNpemVzIHZhcmlhYmxlcyB0aGF0IHBlcnRhaW4gdG8gYm90aCB3ZWVrbHkgYW5kIG92ZXJhbGwgZGF0YS4gVGhlIGRhdGEgZGljdGlvbmFyeSBkZXRhaWxpbmcgdGhlIHNlbGVjdGVkIHZhcmlhYmxlcyBpcyBwcm92aWRlZCBiZWxvdy4KYGBge3J9CiNkYXRhIGRpY3Rpb25hcnk6Q292aWQgY2FzZXMgYW5kIGRlYXRoCkNPVklEPC1Db3ZpZCU+JQogIHNlbGVjdChwcm5hbWUsZGF0ZSxyZXBvcnRpbmdfeWVhcix0b3RhbGNhc2VzLG51bXRvdGFsX2xhc3Q3LG51bWRlYXRocyxudW1kZWF0aHNfbGFzdDcpCgpDb3ZpZEREPC1kYXRhLmZyYW1lKAogIFZhcmlhYmxlcz1jb2xuYW1lcyhDT1ZJRCksICAgCiAgVHlwZT1zYXBwbHkoQ09WSUQsIGZ1bmN0aW9uKHgpIGNsYXNzKHgpKSwKICBFeGFtcGxlPXNhcHBseShDT1ZJRCwgZnVuY3Rpb24oeCkgcGFzdGUoYXMuY2hhcmFjdGVyKGhlYWQodW5pcXVlKHgpLDIpKSwgY29sbGFwc2UgPSAiLCAiKSksCiAgTnVtYmVyLlVuaXF1ZT1zYXBwbHkoQ09WSUQsIGZ1bmN0aW9uKHgpIGxlbmd0aCh1bmlxdWUoeCkpKSwKICBQY3RNaXNzaW5nPXNhcHBseShDT1ZJRCwgZnVuY3Rpb24oeCkgcGFzdGUwKHJvdW5kKHN1bShpcy5uYSh4KSkvbGVuZ3RoKHgpLCA0KSoxMDAsIiUiKSksCiAgQ29tbWVudD1jKCAiRW5nbGlzaCBuYW1lIG9mIGp1cmlzZGljdGlvbiAocHJvdmluY2UsIHRlcnJpdG9yeSwgQ2FuYWRhKSIsCiAgICAgICAgICAgICAgIkxhc3QgZGF5IG9mIHRoZSBlcGlkZW1pb2xvZ2ljIHdlZWsgZm9yIHdoaWNoIHRoZSBkYXRhIHJlcHJlc2VudC4gRXBpZGVtaW9sb2dpY2FsIHdlZWtzIGFyZSBmcm9tIFN1bmRheSB0byBTYXR1cmRheSBhbmQgdGhpcyBkYXRlIHdpbGwgYWx3YXlzIGZhbGwgb24gYSBTYXR1cmRheS4iLAogICAgICAgICAgICAgIlRoZSBjYWxlbmRhciB5ZWFyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXBpZGVtaW9sb2dpYyB3ZWVrIChiYXNlZCBvbiB0aGUgRmx1d2F0Y2ggd2Vla3MgY2FsZW5kYXIpIGluIHdoaWNoIHRoZSBkYXRhIHdhcyByZXBvcnRlZC4oMjAyMC0yMDIzKSIsCiAgICAgICAgICAgICAgIlRoZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgcmVwb3J0ZWQgZnJvbSBKYW51YXJ5IDIwMjAgdW50aWwgdGhlIGVuZCBvZiB0aGUgcmVwb3J0aW5nIHdlZWsgaW4gYSBqdXJpc2RpY3Rpb24uIiwKICAgICAgICAgICAgICJUb3RhbCBudW1iZXIgb2YgY2FzZXMgZHVyaW5nIHRoZSByZXBvcnRpbmcgd2VlayBmb3IgYSBqdXJpc2RpY3Rpb24sIG1pbnVzIHRoZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgZnJvbSB0aGF0IGp1cmlzZGljdGlvbidzIHByZXZpb3VzIHdlZWsncyB1cGRhdGUuIiwKICAgICAgICAgICAgICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlYXRocyByZXBvcnRlZCBmcm9tIEphbnVhcnkgMjAyMCB1bnRpbCB0aGUgZW5kIG9mIHRoZSByZXBvcnRpbmcgd2VlayBpbiBhIGp1cmlzZGljdGlvbi4iLAogICAgICAgICAgICAgIlRvdGFsIG51bWJlciBvZiBkZWF0aHMgZm9yIGEganVyaXNkaWN0aW9uLCBtaW51cyB0aGUgdG90YWwgbnVtYmVyIG9mIGRlYXRocyBmcm9tIHRoYXQganVyaXNkaWN0aW9uJ3MgcHJldmlvdXMgd2VlaydzIHVwZGF0ZS4iCiAgICAgICAgICAgICAKICAgICAgICAgICApCikKQ292aWRERCU+JQogIGd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMi4xLjE6IENPVklELTE5IENhc2VzIGFuZCBEZWF0aCBEYXRhIERpY3Rpb25hcnkiKQoKYGBgCkZyb20gdGhlIFRhYmxlIDIuMS4xLCB3ZSBmb3VuZCB0aGF0IHRoZSBwZXJjZW50YWdlIG9mIG1pc3NpbmcgdmFsdWUgaW4gd2Vla2x5IGNhc2VzIGFuZCBkZWF0aCBjb3VudHMgYXJlIGFib3VuZCAxMCUsIHdoaWNoIGlzIG5vdCBnb29kIGZvciBvdXIgcmVzZWFyY2guIE1pc3NpbmcgdmFsdWVzIGFyZSBtYWlubHkgZm91bmQgaW4gdGhlIG5vcnRoZXJuIGFuZCBzb3V0aGVhc3Rlcm4gcHJvdmluY2VzIGFuZCB0ZXJyaXRvcmllcywgc3VjaCBhcyBOdW5hdnV0IGFuZCBOb3ZhIFNjb3RpYS4gSW4gb3JkZXIgdG8gYXZvaWQgdGhlIGltcGFjdCBvZiBtaXNzaW5nIHZhbHVlcyBvbiB0aGUgc3R1ZHksIHdlIHVzZSB0aGUgdG90YWwgZGVhdGggYW5kIGluZmVjdGlvbnMgb2YgQ09WSUQtMTkgaW4gQ2FuYWRhIGluc3RlYWQgb2YgZXZlcnkgcHJvdmluY2UgYW5kIHRlcnJvdG9yeSBpbiB0aGUgZm9sbG93aW5nIGRpc2N1c3Npb24uCgpTZWNvbmQgZGF0YSBzZXQgaXMgdGhlIHByb3Zpc2lvbmFsIHdlZWtseSBkZWF0aCBjb3VudHMsIGJ5IGFnZXMgYW5kIHNleCBmcm9tIDIwMTAgdG8gMjAyMywgcHVibGlzaGVkIGJ5IFN0YXRpc3RpY3MgQ2FuYWRhLiBUaGlzIGRhdGEgc2V0IHJlY29yZCB0aGUgMTQ5NzMwIG9ic2VydmF0aW9ucyBvZiAxNyB2YXJpYWJsZXMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIG1vbml0b3JpbmcgdGhlIGltcGFjdHMgb2YgbW9ydGFsaXR5IG9mIGV2ZXJ5IHByb3ZpbmNlIGFuZCB0ZXJyaXRvcnkgaW4gQ2FuYWRhLiBXZSBhbHNvIGRlbGV0ZWQgc29tZSB2YXJpYWJsZXMgd2hpY2ggYXJlIGlycmVsZXZhbnQgd2l0aCBvdXIgc3R1ZHkgb3IgY2FuIG5vdCBkZWxpdmVyZWQgdGhlIHVzZWZ1bCBpbmZvcm1hdGlvbiBpbiB0aGlzIGRhdGEgc2V0LiBTdWNoIGFzIHZhcmlhYmxlcyBsaWtlIFNUQVRVUyBhbmQgVEVSTUlOQVRFRCBhcmUgbWlzc2luZyBpbiBhbGwgb2JzZXJ2YXRpb24gaW4gdGhpcyBkYXRhIHNldCBhbmQgdmFyaWFibGVzIERFQ0lNQUxTIGFuZCBVT01fSUQgYXJlIHRoZSBzYW1lIGZvciBhbGwgdmFyaWFibGVzLiBUaGUgZGF0YSBkaWN0aW9uYXJ5IGZvciByZW1haW5pbmcgdmFyaWFibGVzIGlzIHByb3ZpZGVkIGJlbG93LgpgYGB7cn0KI2RhdGEgZGljdGlvbmFyeTpXZWVrbHkgbW9ydGFsaXR5Cm1vcnRhbGl0eTwtV01vcnRhbGl0eSU+JQogIHNlbGVjdChSRUZfREFURSxHRU8sQWdlLmF0LnRpbWUub2YuZGVhdGgsU2V4LENoYXJhY3RlcmlzdGljcyxVT00sVkFMVUUpCmRhdGEuZnJhbWUoCiAgVmFyaWFibGVzPWNvbG5hbWVzKG1vcnRhbGl0eSksICAgCiAgVHlwZT1zYXBwbHkobW9ydGFsaXR5LCBmdW5jdGlvbih4KSBjbGFzcyh4KSksCiAgRXhhbXBsZT1zYXBwbHkobW9ydGFsaXR5LCBmdW5jdGlvbih4KSBwYXN0ZShhcy5jaGFyYWN0ZXIoaGVhZCh1bmlxdWUoeCksMikpLCBjb2xsYXBzZSA9ICIsICIpKSwKICBOdW1iZXIuVW5pcXVlPXNhcHBseShtb3J0YWxpdHksIGZ1bmN0aW9uKHgpIGxlbmd0aCh1bmlxdWUoeCkpKSwKICBQY3RNaXNzaW5nPXNhcHBseShtb3J0YWxpdHksIGZ1bmN0aW9uKHgpIHBhc3RlMChyb3VuZChzdW0oaXMubmEoeCkpL2xlbmd0aCh4KSwgNCkqMTAwLCIlIikpLAogIENvbW1lbnQ9YygiUmVmZXJlbmNlIHBlcmlvZCBmb3IgdGhlIHNlcmllcyBiZWluZyByZWxlYXNlZC4oMjAxMC0yMDIzKSIsCiAgICAgICAgICAgICAiTmFtZSBvZiBkaW1lbnNpb24uIFRoZXJlIGNhbiBiZSB1cCB0byAxMCBkaW1lbnNpb25zIGluIGEgZGF0YSB0YWJsZS4KKGkuZS4gR2VvZ3JhcGh5KSIsCiAgICAgICAgICAgICAiQWdlIGdyb3VvIHdoZW4gZGVhdGggb2NjdXJyZWQiLAogICAgICAgICAgICAgIlNleCAiLAogICAgICAgICAgICAgIk51bWJlciBvZiBkZWF0aHMiLAogICAgICAgICAgICAgIlRoZSB1bml0IG9mIG1lYXN1cmUgYXBwbGllZCB0byBhIG1lbWJlciBnaXZlbiBpbiB0ZXh0LiIsCiAgICAgICAgICAgICAiVG90YWwgbnVtYmVyIG9mIGRlYXRoIHVuZGVyIGNlcnRhaW4gY2hhcmFjdGVyaXN0aWNzIgogICAgICAgICAgICkKKSU+JWd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMi4xLjI6IFdlZWtseSBNb3J0YWxpdHkgRGF0YSBEaWN0aW9uYXJ5IikKCgpgYGAKVGhlIHRvdGFsIG51bWJlciBvZiBkZWF0aCBpbiB0aGlzIGRhdGEgc2V0IGV4aXN0IDkuMjUlIG1pc3NpbmcgZGF0YSBpbiByYXcgZGF0YSBzZXQsIHRoZSBtaXNzaW5nIGRhdGEgYXBwZWFycyBpbiBhbGwgZGF0YSBhZnRlciBKdWx5IDE1LCAyMDIzLiBCZWNhdXNlIHdlIG9ubHkgdXNlIHRoZSBkYXRhIGluIENhbmFkYSB3aXRoIGFsbCBhZ2UgZ3JvdXAgYW5kIGJvdGggc2V4ZXMsIHRoZSBtaXNzaW5nIGRhdGEgb25seSBhY2NvdW50ZWQgZm9yIGxlc3MgdGhhbiAxJSBvZiB0aGUgZGF0YSBzZXQgd2UgZmlsdGVyZWQuIFRoZXJlZm9yZSwgd2Ugb3VyIHN0dWR5IGZvY3VzZWQgb24gdGhlIG92ZXJhbGwgdG90YWwgZGVhdGggYWNjb3VudCBhbmQgdGhlIG51bWJlciBvZiBDT1ZJRC0xOSBkZWF0aHMgaW4gQ2FuYWRhIGR1cmluZyB0aGUgcGVyaW9kIEphbnVhcnkgMjAyMiB0byBKdWx5IDIwMjMuCgpJbiBvcmRlciB0byBoYXZlIGJldHRlciB1bmRlcnN0YW5kaW5nIGFib3V0IHRoZSBtb3J0YWxpdHkgaW4gQ2FuYWRhLCB3ZSB2aXN1YWxpemUgdGhlIHdlZWtseSBkZWF0aCBjb3VudHMgZXZlcnkgeWVhciBmb3JtIDIwMTAgdG8gMjAyMyBpbiBGaWd1cmUyLjEuMiwgaXQgaXMgY2xlYXIgdG8gc2VlIHRoYXQgdGhlICB0aGUgbnVtYmVyIG9mIGFubnVhbCBkZWF0aHMgaXMgaW5jcmVhc2luZyBldmVyeSB5ZWFyLiBUaGUgb3ZlcmFsbCB0cmVuZCBmcm9tIDIwMTAgdG8gMjAxOSBpcyBzaW1pbGFyLCB3aXRoIGFuIGdlbmVyYWwgZGVjcmVhc2UgZnJvbSB0aGUgYmVnZ2luZyB0byB0aGUgbWlkZGxlIG9mIHRoZSB5ZWFyIHRoZW4gZm9sbG93ZWQgYnkgYW4gdXB3YXJkIHRyZW5kIHVudGlsIHRoZSB5ZWFyIGVuZC4gSW4gdGhlIG1pZGRsZSBvZiAyMDIwIGFuZCB0aGUgYmVnaW5uaW5nIG9mIDIwMjIsIHRoZXJlIGV4aXN0IHR3byBzaWduaWZpY2FudCBzcGlrZXMgb24gdGhlIGZpZ3VyZS4gVGhlc2UgcHJvbm91bmNlZCBpbmNyZWFzZXMgaW4gY2FzZSBjb3VudHMgcmFpc2UgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhleSBtYXkgYmUgYXR0cmlidXRlZCB0byBkaXN0aW5jdCBvdXRicmVha3Mgb2YgdGhlIGVwaWRlbWljLiAKCmBgYHtyfQojdml6dWFsaXplIHRoZSBkZWF0aCB3aXRoIGFuZCB3aXRob3V0IGNvdmlkCldNb3J0YWxpdHklPiUKICBtdXRhdGUoWWVhcj15ZWFyKFJFRl9EQVRFKSxXZWVrPXN1YnN0cihSRUZfREFURSw2LDEwKSklPiUKICBtdXRhdGUoWWVhcj1mYWN0b3IoWWVhcikpJT4lCiAgZmlsdGVyKEFnZS5hdC50aW1lLm9mLmRlYXRoPT0iQWdlIGF0IHRpbWUgb2YgZGVhdGgsIGFsbCBhZ2VzIiAmIFNleD09IkJvdGggc2V4ZXMiICYgR0VPPT0iQ2FuYWRhLCBwbGFjZSBvZiBvY2N1cnJlbmNlIiklPiUKICBwbG90X2x5KHg9fldlZWssIHk9flZBTFVFLCBjb2xvcj1+WWVhcix0eXBlID0gInNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIpJT4lCiAgbGF5b3V0KHdpZHRoID0gOTAwLCBoZWlnaHQgPSA1MDAsdGl0bGUgPSAnRmlndXJlMi4xLjI6V2Vla2x5IERlYXRoIENvdW50cycsIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOdW1iZXIgb2YgRGVhdGgiKSkKYGBgCgpgYGB7cn0KV2l0aG91dGM8LVdNb3J0YWxpdHklPiUKICBtdXRhdGUoWWVhcj15ZWFyKFJFRl9EQVRFKSxXZWVrPXN1YnN0cihSRUZfREFURSw2LDEwKSklPiUKICBmaWx0ZXIoQWdlLmF0LnRpbWUub2YuZGVhdGg9PSJBZ2UgYXQgdGltZSBvZiBkZWF0aCwgYWxsIGFnZXMiICYgU2V4PT0iQm90aCBzZXhlcyIgJiBHRU89PSJDYW5hZGEsIHBsYWNlIG9mIG9jY3VycmVuY2UiLFllYXI+PSIyMDIwIiklPiUKICBzZWxlY3QoUkVGX0RBVEUsWWVhciwgV2VlaywgR0VPLENoYXJhY3RlcmlzdGljcyxWQUxVRSklPiUKICBuYS5vbWl0KCkKIFdpdGhvdXRjPC1XaXRob3V0Y1stYygxOjQpLF0KQ088LUNvdmlkJT4lCiAgZmlsdGVyKHBybmFtZT09IkNhbmFkYSIpJT4lCiAgc2VsZWN0KGRhdGUsbnVtZGVhdGhzX2xhc3Q3KQogIGNvbG5hbWVzKENPKVsxXSA8LSAiUkVGX0RBVEUiCgpXT01vcnRhbGl0eTwtV01vcnRhbGl0eSU+JQogIG11dGF0ZShZZWFyPXllYXIoUkVGX0RBVEUpLFdlZWs9c3Vic3RyKFJFRl9EQVRFLDYsMTApKSU+JQogIGZpbHRlcihBZ2UuYXQudGltZS5vZi5kZWF0aD09IkFnZSBhdCB0aW1lIG9mIGRlYXRoLCBhbGwgYWdlcyIgJiBTZXg9PSJCb3RoIHNleGVzIiAmIEdFTz09IkNhbmFkYSwgcGxhY2Ugb2Ygb2NjdXJyZW5jZSIpJT4lCiAgc2VsZWN0KFJFRl9EQVRFLFllYXIsIFdlZWssIEdFTyxDaGFyYWN0ZXJpc3RpY3MsVkFMVUUpCiBXT01vcnRhbGl0eTwtIG1lcmdlKFdPTW9ydGFsaXR5LENPLGJ5PSJSRUZfREFURSIsYWxsPVRSVUUpCiBXT01vcnRhbGl0eTwtIFdPTW9ydGFsaXR5Wy1jKDcwNzo3MjEpLF0KIFdPTW9ydGFsaXR5JG51bWRlYXRoc19sYXN0N1tpcy5uYSggV09Nb3J0YWxpdHkkbnVtZGVhdGhzX2xhc3Q3KV0gPSAwCldPTW9ydGFsaXR5JT4lCiAgbXV0YXRlKERlYXRoX3dpdGhvdXRfY292aWQ9VkFMVUUtbnVtZGVhdGhzX2xhc3Q3KSU+JQogIHBsb3RfbHkoIHg9fldlZWssIHk9fkRlYXRoX3dpdGhvdXRfY292aWQsIGNvbG9yPX5mYWN0b3IoWWVhciksdHlwZSA9ICJzY2F0dGVyIiwgbW9kZT0ibGluZXMiKSU+JQpsYXlvdXQod2lkdGggPSA5MDAsIGhlaWdodCA9IDUwMCwgdGl0bGUgPSAnRmlndXJlMi4xLjM6V2Vla2x5IERlYXRoIENvdW50cyB3aXRob3V0IENPSVZEIGNhc2VzJyx5YXhpcyA9IGxpc3QodGl0bGUgPSAiTnVtYmVyIG9mIERlYXRoIHdpdGhvdXQgQ09WSUQiKSkKYGBgClRvIHZlcmlmeSB0aGlzIGNvbmplY3R1cmUsIHdlIHNob3dlZCB0aGUgd2Vla2x5IG51bWJlciBvZiBkZWF0aCB3aXRob3V0IHRoZSBDT1ZJRC0xOSBjYXNlcyBpbiBGaWd1cmUyLjEuMy4gVGhlIHNwaWtlcyBpbiAyMDIwIGFuZCAyMDIyIGFyZSByZW1vdmVkIGJ1dCB0aGUgc21hbGwgc3Bpa2UgaW4gbWlkLTIwMjEgc3RpbGwgZXhpc3QuIFNvIGRlYXRoIGNvdW50cyByYXBpZCBpbmNyZWFzZSBpbiAyMDIwIGFuZCAyMDIyIG1heSBjYXVzZWQgYnkgQ09WSUQtMTkgYW5kIHdlIHdpbGwgZGlzY3VzcyB0aGUgcHJvYmFiaWxpdHkgb2YgIENPVklELTE5IGRlYXRocyBpbiB0aGUgdG90YWwgbnVtYmVyIG9mIGRlYXRoIGNvbmRpdGlvbiBvbiB5ZWFyIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbi4KCiMjIExvbmctdGVybSBJbXBhY3QKClRoZSBkYXRhIG9mIENPVklELTE5IGxvbmcgdGVybSBzeW1wdG9tIGFtb25nIENhbmFkaWFuIGFkdWx0cyBpcyBmcm9tIHRoZSBDYW5hZGlhbiBDT1ZJRC0xOSBBbnRpYm9keSBhbmQgSGVhbHRoIFN1cnZleSAoQ0NBSFMpIEN5Y2xlMi4gVGhlIHN1cnZleSBjb2xsZWN0ZWQgdGhlIGRhdGEgb3ZlciAzIGNvbGxlY3Rpb24gcGVyaW9kcyBiZXR3ZWVuIEFwcmlsIDIwMjIgYW5kIEF1Z3VzdCAyMDIyLiBUaGUgdGFyZ2V0IHBvcHVsYXRpb24gZm9yIHRoaXMgc3VydmV5IHdhcyBhZHVsdHMgMTggeWVhcnMgb2YgYWdlIGFuZCBvbGRlciBsaXZpbmcgaW4gdGhlIDEwIHByb3ZpbmNlcyBhY3Jvc3MgQ2FuYWRhLiBSZXNwb25kZW50cyB3aG8gcmVwb3J0ZWQgZXhwZXJpZW5jaW5nIHN5bXB0b21zIGF0IGxlYXN0IHRocmVlIG1vbnRocyBhZnRlciBhIHBvc2l0aXZlIENPVklELTE5IHRlc3Qgd2VyZSBjb25zaWRlcmVkIHRvIGhhdmUgbG9uZy10ZXJtIHN5bXB0b21zLltATG9uZ1Rlcm1dIFRoZSBsb25nIHRlcm0gc3ltcHRvbXMgZGF0YSB1c2VkIGluIHRoaXMgc3R1ZHkgaGFzIGJlZW4gcHJlLXByb2Nlc3NlZCBieSBTdGF0aXN0aWNzIENhbmFkYS4gSXQgaXMgZ3JvdXBlZCBieSBzZXggYW5kIGFnZSBncm91cHMuIFRoZSBtZWFzdXJlIGlzIGJpbmFyeSByZXNwb25zZSBmcm9tIHRoZSByZXNwb25kZW50cy4gVGhlIHZhbHVlIHNob3dzIHRoZSBwZXJjZW50YWdlIG9mIHJlc3BvbnNlcyB3aXRoaW4gZWFjaCBzcGVjaWZpYyBncm91cC4gVGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFyZSBwcm92aWRlZCBpbiB0aGUgYXNzZXNzbWVudCBvZiBwb2ludCBlc3RpbWF0ZXMgaW4gY2FzZSBvZiBoaWdoIHZhcmlhYmlsaXR5IGluIHRoZSBkYXRhLiAKClRoZSBkZWZpbml0aW9uIG9mIG1haW4gdmFyaWFibGVzIGluIHRoZSBkYXRhIGlzIHNob3duIGluIGZvbGxvd2luZyBUYWJsZSAyLjIuMS4KCmBgYHtyfQpEYXRhRGljdF9kYXRhIDwtIExvbmdUZXJtWyxjKDEsMiw0LDUsNiw3LDgsMTQsMTgpXQoKRGF0YURpY3Q8LWRhdGEuZnJhbWUoCiAgVmFyaWFibGVzPWNvbG5hbWVzKERhdGFEaWN0X2RhdGEpLCAgIAogIFR5cGU9c2FwcGx5KERhdGFEaWN0X2RhdGEsIGZ1bmN0aW9uKHgpIGNsYXNzKHgpKSwKICBFeGFtcGxlPXNhcHBseShEYXRhRGljdF9kYXRhLCBmdW5jdGlvbih4KSBwYXN0ZShhcy5jaGFyYWN0ZXIoaGVhZCh1bmlxdWUoeCksMikpLCBjb2xsYXBzZSA9ICIsICIpKSwKICBOdW1iZXIuVW5pcXVlPXNhcHBseShEYXRhRGljdF9kYXRhLCBmdW5jdGlvbih4KSBsZW5ndGgodW5pcXVlKHgpKSksCiAgUGN0TWlzc2luZz1zYXBwbHkoRGF0YURpY3RfZGF0YSwgZnVuY3Rpb24oeCkgcGFzdGUwKHJvdW5kKHN1bShpcy5uYSh4KSkvbGVuZ3RoKHgpLCA0KSoxMDAsIiUiKSksCiAgQ29tbWVudD1jKCJSZWZlcmVuY2UgWWVhciAoMjAyMikiLAogICAgICAgICAgICAgICAgICAiR2VvZ3JhcGhpYyBMb2NhdGlvbiAoQ2FuYWRhKSIsCiAgICAgICAgICAgICAgICAgICJEb2VzIHRoZSByZXNwb25kZW50IGhhdmUgdGhlIGxvbmcgdGVybSBzeW1wdG9tcz8gWWVzIG9yIE5vLiIsCiAgICAgICAgICAgICAgICAgICJTZXggQ2F0ZWdvcnkiLAogICAgICAgICAgICAgICAgICAiQWdlIEdyb3VwcyIsCiAgICAgICAgICAgICAgICAgICJDaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHZhbHVlLCBlc3RpbWF0ZSBvciBjb25maWRlbmNlIGludGVydmFsIiwKICAgICAgICAgICAgICAgICAgIlVuaXQgb2YgTWVhc3VyZSAoUGVyY2VudGFnZSBvZiB0aGUgZ3JvdXApIiwKICAgICAgICAgICAgICAgICAgIkRhdGEgVmFsdWUiLAogICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIERlY2ltYWwgUGxhY2VzIGluIFZhbHVlIikKKQpEYXRhRGljdCU+JWd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMi4yLjE6IExvbmcgVGVybSBTeW1wdG9tcyBEYXRhIERlZmluaXRpb24iKQpgYGAKCkluIHRoZSBzdHVkeSwgd2UgZHJvcHBlZCB2YXJpYWJsZXMgbGlrZSAiUkVGX0RBVEUiLCAiR0VPIiB3aGljaCBjb250YWluIHRoZSBzdXJ2ZXkgaW5mb3JtYXRpb24gYW5kIGFyZSB0aGUgc2FtZSBhY3Jvc3MgdGhlIGVudGlyZSBkYXRhLiBBIGRhdGEgb2YgY3VycmVudCBDT1ZJRC0xOSBjYXNlcyBpbiBDYW5hZGEgW0BDT1ZJRENBU0VfQUddIHdhcyB1c2VkIHRvIGVzdGltYXRlIHRoZSBtaXNzaW5nIHZhcmlhYmxlcyBuZWNlc3NhcnkgZm9yIHRoZSB0ZXN0IHdlIGFwcGxpZWQgaW4gbGF0ZXIgU2VjdGlvbiAzLjIuCgojIyBQcmV2YWxlbmNlIE1vZGVsaW5nCgpXZSB1c2VkIHRoZSBDYW5hZGlhbiBDT1ZJRC0xOSBBbnRpYm9keSBhbmQgSGVhbHRoIFN1cnZleSAoQ0NBSFMpIEN5Y2xlIDEgbWljcm9kYXRhIGluIG1vZGVsaW5nIHRoZSBwcmV2ZWxhbmNlLiBUaGUgQ0NBSFMgaXMgY29sbGVjdGluZyBrZXkgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIHBhbmRlbWljIHRvIGxlYXJuIGFzIG11Y2ggYXMgcG9zc2libGUgYWJvdXQgdGhlIHZpcnVzLCBob3cgaXQgYWZmZWN0cyBvdmVyYWxsIGhlYWx0aCwgaG93IGl0IHNwcmVhZHMsIGFuZCB3aGV0aGVyIENhbmFkaWFucyBhcmUgZGV2ZWxvcGluZyBhbnRpYm9kaWVzIGFnYWluc3QgaXQuIFtAQ0NBSFNdIFRoZSBzdXJ2ZXkgY29udGFpbmVkIHR3byBwYXJ0cywgYW4gZWxlY3Ryb25pYyBxdWVzdGlvbm5haXJlIGFuZCBhbiBhdC1ob21lIGJsb29kIHRlc3QuIFRoZSBxdWVzdGlvbm5haXJlIGFpbWVkIHRvIGdldCBnZW5lcmFsIGhlYWx0aCBhbmQgZXhwb3N1cmUgY29uZGl0aW9ucyBvZiBwYXJ0aWNpcGFudHMsIHdoZXJlYXMgdGhlIGJsb29kIHRlc3Qgd2FzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwcmVzZW5jZSBvZiBDT1ZJRC0xOSBhbnRpYm9kaWVzLgoKVGhlIHN1cnZleSB3YXMgZGVzaWduZWQgYXMgY3Jvc3Mtc2VjdGlvbmFsIGFuZCB3YXMgZ2l2ZW4gdG8gaW5kaXZpZHVhbHMgb3ZlciAxIHllYXJzIG9sZCwgZXhjbHVkaW5nIHRoZSBwb3B1bGF0aW9uIGluIHJlbW90ZSBhcmVhcyBvZiBDYW5hZGEuIFRoZSBkYXRhIHdlcmUgc2FtcGxlZCByYW5kb21seSBmcm9tIDMwIHN0cmF0YSBjcmVhdGVkIGZyb20gZWFjaCBwcm92aW5jZS4gRHVlIHRvIHRoZSB2YXJpb3VzIHNpemUgb2YgdGhlIHBvcHVsYXRpb24gb2YgZWFjaCBzdHJhdHVtLCBTdGF0aXN0aWNzIENhbmFkYSBoYWQgdG8gYWRqdXN0IHRoZSBzYW1wbGUgc2l6ZSBpbiB0aG9zZSBzdHJhdGEgd2l0aCBhIGxhcmdlciBwb3B1bGF0aW9uIGFuZCBoaWdoZXIgcHJvcG9ydGlvbiBvZiBDT1ZJRCBjb25maXJtZWQgY2FzZXMsIGVuc3VyaW5nIGEgcHJlY2lzZSBlc3RpbWF0ZSBvZiB0aGUgcHJldmFsZW5jZS4gSW4gYWRkaXRpb24sIGEgdHdvLXN0YWdlIHNhbXBsaW5nIG1ldGhvZCB3YXMgZG9uZSBhdCB0aGUgaG91c2Vob2xkIGxldmVsLCBmcm9tIHdoaWNoIG9uZSBvZiB0aGUgaG91c2Vob2xkIG1lbWJlcnMgd2FzIHNlbGVjdGVkIGZvciB0aGUgc3VydmV5LiBJbiB0b3RhbCwgYSBzYW1wbGUgc2l6ZSBvZiA0NzkwMCBwZW9wbGUgd2VyZSBzZWxlY3RlZCBhbmQgYWJvdXQgMjMuMCUgcmVzcG9uZGVkIGNvbXBsZXRlbHkgdGhlIHN1cnZleS4KClRoZSByZXN1bHRlZCBkYXRhIGNvbnRhaW5lZCAxMDk3OCBudW1iZXIgb2YgcmVzcG9uc2VzIGFuZCA5OSB2YXJpYWJsZXMuIER1ZSB0byB0aGUgbGFyZ2Ugc2l6ZSBvZiB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlcywgd2Ugb25seSBzZWxlY3RlZCB0aGUgb25lcyB0aGF0IHdlIHdlcmUgbW9zdGx5IGludGVyZXN0ZWQgaW4uIFdlIGJlbGlldmVkIHRoYXQgdGhlIHNlbGVjdGVkIHZhcmlhYmxlcyB3ZXJlIG1vc3QgbGlrZWx5IHNpZ25pZmljYW50IGluIG1vZGVsaW5nIHRoZSBwcmV2YWxlbmNlIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGxvb2sgaW50byB0aGUgZGF0YS4gQWZ0ZXIgYWxsLCBhIHZhcmlhYmxlIHNob3dpbmcgaWYgdGhlIHJlc3BvbmRlbnQgaGFkIGEgZmFtaWx5IGRvY3RvciBvciBub3QgbWlnaHQgYmUgbGVzcyBsaWtlbHkgdG8gYWZmZWN0IHRoZSBwcmV2YWxlbmNlIHRoYW4gYSB2YXJpYWJsZSBzaG93aW5nIHRoZSB2YWNjaW5hdGlvbiBzdGF0dXMuIEhvd2V2ZXIsIG9uZSBtdXN0IG5vdGUgdGhhdCB0aGVyZSBtaWdodCBiZSBwcmVkaWN0b3JzIHRoYXQgY291bGQgaW5kaXJlY3RseSBhZmZlY3QgdGhlIHJlc3BvbnNlIHZhcmlhYmxlLiBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGZpbmQgdGhlIHZhcmlhYmxlIHNob3dpbmcgdGhlIHJlc3BvbnNlIHRvIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb246ICJXaGF0IGFyZSB0aGUgcmVhc29ucyB5b3Ugd291bGQgbm90IGdldCB0aGUgQ09WSUQtMTkgdmFjY2luZT8gLSBEbyBub3QgY29uc2lkZXIgaXQgbmVjZXNzYXJ5IHRvIGdldCB0aGUgdmFjY2luZSIuIFRoaXMgdmFyaWFibGUgbWlnaHQgaGF2ZSBpbmZsdWVuY2Ugb24gdGhlIHByZXZhbGVuY2UgYmVjYXVzZSBubyB2YWNjaW5lIHdhcyBnaXZlbiB0byB0aGUgcmVzcG9uZGVudC4gSG93ZXZlciwgd2UgdGhvdWdodCB0aGF0IGl0IHdhcyByYXRoZXIgbGVzcyBpbmZvcm1hdGl2ZSBiZWNhdXNlIHRoZSBpbmZvcm1hdGlvbiB3YXMgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdmFjY2luYXRpb24gc3RhdHVzLiBUaGVyZWZvcmUsIHdlIG9ubHkgY2hvc2UgdGhvc2UgdmFyaWFibGVzIHRoYXQgY2FuIGhhdmUgYSBkaXJlY3QgaW1wYWN0IG9uIHRoZSBwcmV2YWxlbmNlLiBNb3Jlb3ZlciwgdmFyaWFibGVzIGNvdWxkIGhhdmUgaW52YWxpZCBjYXRlZ29yaWVzIGxpa2UgIlZhbGlkIHNraXAiIG9yICJOb3Qgc3RhdGVkIi4gVGhlc2UgY2F0ZWdvcmllcyB3ZXJlIHByZXNlbnQgZHVlIHRvIHJlZ3VsYXRpb24gYW5kIGxhdyByZWluZm9yY2VtZW50LCBhbmQgdGhlIHN1cnZleSBpcyBkZXNpZ25lZCBlbnRpcmVseSB2b2x1bnRhcnkuIFRoZXJlZm9yZSB0aGVzZSBjYXRlZ29yaWVzIHdlcmUgdHJlYXRlZCBieSB1cyBhcyBtaXNzaW5nIGRhdGEuIEFueSB2YXJpYWJsZSB3aXRoIGEgaGlnaCBwZXJjZW50YWdlIG9mIG1pc3NpbmcgdmFsdWVzICg+MjUlKSB3ZXJlIGRyb3BwZWQuIAoKV2UgZ2F2ZSBhIGRhdGEgZGVmaW5pdGlvbiBpbiBUYWJsZSAyLjMuMSBiZWxvdy4gCgpgYGB7cn0KUmVncmVzc2lvbkRhdGE8LUNDQUhTJT4ldHJhbnNtdXRlKENvdmlkX1N0YXR1cz1jYXNlX3doZW4oQ1NfMzU9PTEgfiAiWWVzIiwgQ1NfMzU9PTIgfiAiTm8iLCAuZGVmYXVsdCA9IE5BKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocm9uaWM9Y2FzZV93aGVuKENIUkdOVU09PTAgfiAiTm8iLCBDSFJHTlVNPT05IH4gTkEsIC5kZWZhdWx0ID0gIlllcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0Q29udGFjdD1jYXNlX3doZW4oUkFfMTA9PTIgfiAiWWVzIiwgUkFfMTA9PTkgfiBOQSwgLmRlZmF1bHQgPSAiTm8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtb2tlPWNhc2Vfd2hlbihSQV8zNT09MSB+ICJZZXMiLCBSQV8zNT09MiB+ICJObyIsIC5kZWZhdWx0ID0gTkEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FzaEhhbmQ9Y2FzZV93aGVuKEhCXzIwQT09MX4iQWx3YXlzIixIQl8yMEE9PTJ+Ik9mdGVuIixIQl8yMEE9PTN+Ik9jY2FzaW9uYWxseSIsSEJfMjBBPT00fiJOZXZlciIsLmRlZmF1bHQgPSBOQSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWFyTWFzaz1jYXNlX3doZW4oSEJfMjBCPT0xfiJBbHdheXMiLEhCXzIwQj09Mn4iT2Z0ZW4iLCBIQl8yMEI9PTN+Ik9jY2FzaW9uYWxseSIsIEhCXzIwQj09NH4iTmV2ZXIiLC5kZWZhdWx0ID0gTkEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2VlcDJtPWNhc2Vfd2hlbihIQl8yMEQ9PTF+IkFsd2F5cyIsSEJfMjBEPT0yfiJPZnRlbiIsIEhCXzIwRD09M34iT2NjYXNpb25hbGx5IiwgSEJfMjBEPT00fiJOZXZlciIsLmRlZmF1bHQgPSBOQSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZENyb3dkcz1jYXNlX3doZW4oSEJfMjBFPT0xfiJBbHdheXMiLEhCXzIwRT09Mn4iT2Z0ZW4iLCBIQl8yMEU9PTN+Ik9jY2FzaW9uYWxseSIsIEhCXzIwRT09NH4iTmV2ZXIiLC5kZWZhdWx0ID0gTkEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmx1VmFjPWNhc2Vfd2hlbihGTFVfMDU9PTF+IlllcyIsRkxVXzA1PT0yfiJObyIsLmRlZmF1bHQgPSBOQSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWNjaW5lU3RhdHVzPWNhc2Vfd2hlbihWWEQwNT09MSB+ICJZZXMiLCBWWEQwNT09MiB+ICJObyIsIC5kZWZhdWx0ID0gTkEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V4PWNhc2Vfd2hlbihHRFJfMDU9PTl+TkEsIC5kZWZhdWx0ID0gR0RSXzA1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZT1jYXNlX3doZW4oQUdFR1JQPT05fk5BLC5kZWZhdWx0ID0gQUdFR1JQKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUhvdXNlPWNhc2Vfd2hlbihISENEVj09OX5OQSwuZGVmYXVsdCA9IEhIQ0RWKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudGlCb2R5UmVzdWx0PWZhY3RvcihjYXNlX3doZW4oTEFCRENPVkQ9PTF+IlBvc2l0aXZlIixMQUJEQ09WRD09Mn4iTmVnYXRpdmUiLExBQkRDT1ZEPT0zfiJJbmRldGVybWluYXRlIiksIGxldmVscyA9IGMoIk5lZ2F0aXZlIiwgIkluZGV0ZXJtaW5hdGUiLCAiUG9zaXRpdmUiKSkKKSU+JQogIG11dGF0ZShhY3Jvc3MoYyhDb3ZpZF9TdGF0dXMsIGNocm9uaWMsIERpcmVjdENvbnRhY3QsIFNtb2tlLCBGbHVWYWMsIFZhY2NpbmVTdGF0dXMpLCB+ZmFjdG9yKC4sIGxldmVscyA9IGMoIk5vIiwgIlllcyIpKSkpJT4lCiAgbXV0YXRlKGFjcm9zcyhjKFdhc2hIYW5kLCBXZWFyTWFzaywgS2VlcDJtLCBBdm9pZENyb3dkcyksIH5mYWN0b3IoLiwgbGV2ZWxzID0gYygiTmV2ZXIiLCAiT2NjYXNpb25hbGx5IiwiT2Z0ZW4iLCAiQWx3YXlzIikpKSklPiUKICBtdXRhdGUoYWNyb3NzKGMoU2V4LCBBZ2UsIE51bUhvdXNlKSwgZmFjdG9yKSkKIAoKRGF0YURpY3Q8LWRhdGEuZnJhbWUoCiAgVmFyaWFibGVzPWNvbG5hbWVzKFJlZ3Jlc3Npb25EYXRhKSwgICAKICBUeXBlPXNhcHBseShSZWdyZXNzaW9uRGF0YSwgZnVuY3Rpb24oeCkgY2xhc3MoeCkpLAogIEV4YW1wbGU9c2FwcGx5KFJlZ3Jlc3Npb25EYXRhLCBmdW5jdGlvbih4KSBwYXN0ZShhcy5jaGFyYWN0ZXIoaGVhZCh1bmlxdWUoeCksMikpLCBjb2xsYXBzZSA9ICIsICIpKSwKICBOdW1iZXIuVW5pcXVlPXNhcHBseShSZWdyZXNzaW9uRGF0YSwgZnVuY3Rpb24oeCkgbGVuZ3RoKHVuaXF1ZSh4KSkpLAogIFBjdE1pc3Npbmc9c2FwcGx5KFJlZ3Jlc3Npb25EYXRhLCBmdW5jdGlvbih4KSBwYXN0ZTAocm91bmQoc3VtKGlzLm5hKHgpKS9sZW5ndGgoeCksIDQpKjEwMCwiJSIpKSwKICBDb21tZW50PWMoIkhhZCB0aGUgcmVzcG9uZGVudCBldmVyIGhhZCBhIHBvc2l0aXZlIHRlc3QgcmVzdWx0PyIsCiAgICAgICAgICAgICAgICAgICJIYWQgdGhlIHJlc3BvbmRlbnQgcmVwb3J0ZWQgaGF2aW5nIGNocm9uaWMgY29uZGl0aW9uPyIsCiAgICAgICAgICAgICAgICAgICJJbiB0aGUgbGFzdCBzaXggbW9udGhzLCBoYWQgdGhlIHJlc3BvbmRlbnQgd29ya2VkIGluIGRpcmVjdCBjb250YWN0IHdpdGggcGVvcGxlPyIsCiAgICAgICAgICAgICAgICAgICJEb2VzIHRoZSByZXNwb25kZW50IGN1cnJlbnRseSBzbW9rZSB0b2JhY2NvPyIsCiAgICAgICAgICAgICAgICAgICJXYXNoIGhhbmRzIG9mdGVuPyIsCiAgICAgICAgICAgICAgICAgICJXZWFyIGEgbWFzayBpbiBpbmRvb3IgcHVibGljIHNwYWNlcyB3aGVyZSBwaHlzaWNhbCBkaXN0YW5jaW5nIGlzIGRpZmZpY3VsdCBvciBhIG1hbmRhdG9yeSBtYXNrIGJ5LWxhdyBleGlzdHM/IiwKICAgICAgICAgICAgICAgICAgIktlZXAgYSAyIG1ldGVyIG9yIDYgZm9vdCBkaXN0YW5jZSBmcm9tIG90aGVycz8iLAogICAgICAgICAgICAgICAgICAiQXZvaWQgY3Jvd2RzIGFuZCBsYXJnZSBnYXRoZXJpbmdzPyIsCiAgICAgICAgICAgICAgICAgICJJbiB0aGUgcGFzdCAxMiBtb250aHMsIGhhdmUgeW91IGhhZCBhIHNlYXNvbmFsIGZsdSB2YWNjaW5lPyIsCiAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBhdCBsZWFzdCBvbmUgdmFjY2luZSBkb3NlIGFnYWluc3QgQ09WSUQtMTk/IiwKICAgICAgICAgICAgICAgICAgIlNleDogMSAtIE1hbGUsIDIgLSBGZW1hbGUiLAogICAgICAgICAgICAgICAgICAiQWdlIGdyb3VwOiAxLTE5LCAyMC0zOSwgNDAtNTksIDYwIGFuZCBvbGRlciIsCiAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgcGVvcGxlIGxpdmluZyBpbiBob3VzZWhvbGQ6IDEsIDIsIDMsIGFuZCA0IG9yIG1vcmUiLAogICAgICAgICAgICAgICAgICAiVGhlIG92ZXJhbGwgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGxhYm9yYXRvcnkgcmVzdWx0IGlzIHRoYXQgaWYgMCBvZiAzIGFudGlnZW4gdGVzdHMgd2FzIHBvc2l0aXZlLCB0aGUgcmVzcG9uZGVudCBoYWQgYW4gb3ZlcmFsbCBuZWdhdGl2ZSB0ZXN0IGZvciBhbnRpYm9kaWVzIGFnYWluc3QgU0FSUy1Db1YtMiwgaWYgMSBvZiAzIGFudGlnZW4gdGVzdHMgd2FzIHBvc2l0aXZlLCB0aGUgcmVzcG9uZGVudCBoYWQgYW4gb3ZlcmFsbCBpbmRldGVybWluYXRlIHRlc3QgZm9yIGFudGlib2RpZXMgYWdhaW5zdCBTQVJTLUNvVi0yLCBhbmQgaWYgMiBvciBtb3JlIG9mIDMgYW50aWdlbiB0ZXN0cyB3ZXJlIHBvc2l0aXZlLCB0aGUgcmVzcG9uZGVudCBoYWQgYW4gb3ZlcmFsbCBwb3NpdGl2ZSB0ZXN0IGZvciBhbnRpYm9kaWVzIGFnYWluc3QgU0FSUy1Db1YtMi4iKQopCkRhdGFEaWN0JT4lZ3QoKSU+JXRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJUYWJsZSAyLjMuMTogQ09WSUQgU3RhdHVzIERhdGEgRGVmaW5pdGlvbiIpCmBgYAoKVG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHJlc3BvbnNlIHZhcmlhYmxlIENvdmlkX1N0YXR1cyB3aXRoIG90aGVyIHByZWRpY3RvcnMsIHdlIGZpdHRlZCBsb2dpc3RpYyBtb2RlbHMgaW4gU2VjdGlvbiAzLjMgYW5kIHByb3ZpZGVkIGFkZGl0aW9uYWwgaW5mZXJlbmNlcy4gCgojIFJlc3VsdAoKCiMjIE1vcnRhbGl0eQpJbiBvcmRlciB0byBkaXNjdXNzIHRoZSBwcm9iYWJpbGl0eSBvZiBDT1ZJRC0xOSBkZWF0aCBpbiB0aGUgdG90YWwgZGVhdGgsIHdlIGZpcnN0IGNhbGN1bGF0ZWQgdGhlIHByb3BvcnRpb24gZm9yIHRoZSBDT1ZJRC0xOSBkZWF0aCBmcm9tIDIwMjAgdG8gMjAyMyBpbiBUYWJsZSAzLjEuMS4gVG8gb3VyIHN1cnByaXNlLCB0aGUgcHJvcG9ydGlvbiBpbiAyMDIyIGlzIHRoZSBoaWdoZXIgdGhhbiB0aGUgcHJvcG9ydGlvbiBpbiAyMDIwLCAwLjA1NzQgYW5kIDAuMDQ5MCByZXNwZWN0aXZlbHkuIFRoaXMgbWlnaHQgYmVjYXVzZSB0aGUgb3V0YnJlYWsgb2YgdGhlIG5ldyB2YXJpYW50IE9taWNyb24uIFRoZSBwcm9wb3J0aW9uIGluIDIwMjEgYW5kIDIwMjMgYXJlIHJlbGF0aXZlbHkgbG93IG1pZ2h0IGJlY2F1c2UgdGhlIHBvcHVsYXRpb24gb2YgdmFjY2luYXRpb24gaW5jcmVhc2UuCmBgYHtyfQojQ29udGluZ2VuY3kgdGFibGUgZm9yIG1vcnRhbGl0eSByYXRlIFZTIHllYXIoT2RkcyBSYXRpbykKdGRlYXRoPC1XT01vcnRhbGl0eSU+JQogIGZpbHRlciggWWVhcj49IjIwMjAiKSU+JQogIGdyb3VwX2J5KFllYXIpJT4lCiAgc3VtbWFyaXNlKFRvdGFsRGVhdGg9c3VtKFZBTFVFKSxUb3RhbGNvdmlkZGVhdGg9c3VtKG51bWRlYXRoc19sYXN0NyksIENEcmF0ZT1Ub3RhbGNvdmlkZGVhdGgvVG90YWxEZWF0aCkKWT1yb3VuZCh0ZGVhdGgkQ0RyYXRlLDQpCnRibDwtZGF0YS5mcmFtZShjYmluZChjKDIwMjAsMjAyMSwyMDIyLDIwMjMpLFksMS1ZKSkKY29sbmFtZXModGJsKTwtYygiWWVhciIsIkNvdmlkIERlYXRoIiwgIk5vdCBDb3ZpZCBEZWF0aCIpCnRibCU+JWd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMy4xLjE6IENvbnRpbmdlbmN5IHRhYmxlIGZvciBwcm9wb3J0aW9uIG9mIENPVklELTE5IGRlYXRoIikKYGBgCgpUbyB0ZXN0IHRoZSBob21vZ2VuZWl0eSBmb3IgQ09WSUQtMTkgZGVhdGggcHJvYmFiaWxpdHkgY29uZGl0aW9uIG9uIHllYXJzLCB3ZSBjYW4gdXNlIHRoZSBDaGktc3F1YXJlIHRlc3QgYW5kIHRoZSBudWxsIGFuZCBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzIG9mIGhvbW9nZW5laXR5IGNvcnJlc3BvbmRpbmcgdG86ClxiZWdpbntnYXRoZXIqfQpIXzA6UF97anxpfVwgPVwgUF97wrdqfVxcCkhfMTpQX3tqfGl9XG5lcSBQX3vCt2p9ClxlbmR7Z2F0aGVyKn0KCmBgYHtyfQojIHRhYmxlKGNoaS1zcXVhcmUpIHRlc3QgaG9tb2dlbmVpdHkgCllDPXRkZWF0aCRUb3RhbGNvdmlkZGVhdGgKTkM9dGRlYXRoJFRvdGFsRGVhdGgtdGRlYXRoJFRvdGFsY292aWRkZWF0aApudGJsPC1kYXRhLmZyYW1lKGNiaW5kKFlDLE5DKSkKY29sbmFtZXMobnRibCk8LWMoIkNvdmlkIiwgIk5vdCBDb3ZpZCIpCm50YmxzPSBjYmluZChjKCIyMDIwIiwiMjAyMSIsIjIwMjIiLCIyMDIzIiksbnRibCkKICBjb2xuYW1lcyhudGJscyk8LWMoIlllYXIiLCJDb3ZpZCIsICJOb3QgQ292aWQiKQojbnRibHMlPiUKICAjZ3QoKSU+JXRhYl9oZWFkZXIoCiAgICAjdGl0bGUgPSAiVGFibGUgMy4xLjE6IENvbnRpbmdlbmN5IHRhYmxlIGZvciBkZWF0aCBjb3VudHMiKQpjaGlfc3F1YXJlPC1jKGNoaXNxLnRlc3QobnRibCkkc3RhdGlzdGljICxHVGVzdChudGJsKSRzdGF0aXN0aWMpCnBfdmFsdWU8LWMoY2hpc3EudGVzdChudGJsKSRwLnZhbHVlLEdUZXN0KG50YmwpJHAudmFsdWUpCnRlc3Q8LWMoIkNoaS1zcXVhdGVkIHRlc3QiLCJMaWtlbGlob29kIHJhdGlvIHRlc3QiKQogIENoaTwtZGF0YS5mcmFtZSh0ZXN0LGNoaV9zcXVhcmUscF92YWx1ZSkKc2lnbmlmaWNhbmNlX2xldmVsIDwtIDAuMDUKQ2hpJT4lCiAgIGd0KCkgJT4lCiAgdGFiX2hlYWRlcigKICAgIHRpdGxlID0gIlRhYmxlMy4xLjM6UmVzdWx0IGZvciB0ZXN0IGhvbW9nZW5laXR5IGJldHdlZW4gQ09WSUQtMTkgZGVhdGggYW5kIFllYXIiCiAgKSAlPiUKICAgY29sc19sYWJlbCgKICAgY2hpX3NxdWFyZSA9ICJDaGktU3F1YXJlZCBTdGF0aXN0aWMiLAogICAgcF92YWx1ZSA9ICJQLVZhbHVlIiwKICAgIHRlc3Q9IlRlc3QiCiAgKSAlPiUKICBmbXQoCiAgICBjb2x1bW5zID0gdmFycyhwX3ZhbHVlKSwKICAgIGZucyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWZlbHNlKHggPCBzaWduaWZpY2FuY2VfbGV2ZWwsIHBhc3RlKCI8Iiwgc2lnbmlmaWNhbmNlX2xldmVsKSwgc3ByaW50ZigiJS4zZiIsIHgpKQogICAgfQogICkKYGBgClRoZSBDaGktc3F1YXJlcyBzdGF0aXN0aWNzIGNvbXB1dGVkIGJ5IENoaS1zcXVhcmVkIHRlc3QgYW5kIExpa2VsaWhvb2QgcmF0aW8gdGVzdCBpcyBkaWZmZXJlbnQgYnV0IHRoZSBwLXZhbHVlIGlzIGxlc3MgdGhhbiAwLjA1IGluIGJvdGggdGVzdC4gVGh1cyB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB1bmRlciB0aGUgMC4wNSBsZXZlbCBzaW5jZSB0aGVyZSBoYXZlICBzdHJvbmcgZXZpZGVuY2UgdGhhdCBleGlzdCBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHByb2JhYmlsaXR5IGluIENPVklELTE5IGRlYXRoIHByb2JhYmlsaXR5IGNvbmRpdGlvbiBvbiB5ZWFycy4KClRoZW4gd2UgY2FuIGNvbXB1dGUgdGhlIHJlbGF0aXZlIHJpc2sgYW5kIG9kZHMgcmF0aW8gZm9yIHllYXJzIHRvIG1lYXN1cmUgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4geWVhcnMgYW5kIENPVklELTE5IGRlYXRoIHByb3BvcnRpb24uIFdlIGNob3NlIHRoZSBDT1ZJRC0xOSBkZWF0aCBwcm9wb3J0aW9uIGluIDIwMjAgeWVhciBhcyBiYXNlbGluZSBjYXRlZ29yeSBhbmQgY29tcHV0ZSB0aGUgcmVsYXRpdmUgcmlza3MgYW5kIG9kZHMgcmF0aW9zLgoKYGBge3J9CiNSZWxhdGl2ZSBSaXNrClRibDwtYXMubWF0cml4KHRibFssYygyLDMpXSkKUlIyMT1yb3VuZChUYmxbMiwxXS9UYmxbMSwxXSw0KQpSUjIyPXJvdW5kKFRibFszLDFdL1RibFsxLDFdLDQpClJSMjM9cm91bmQoVGJsWzQsMV0vVGJsWzEsMV0sNCkKUlJ0Ymw8LWRhdGEuZnJhbWUoIlJlbGF0aXZlIHJpc2siLFJSMjEsUlIyMixSUjIzKQpjb2xuYW1lcyhSUnRibCk8LWMoIlllYXIiLCAiMjAyMSIsICIyMDIyIiwiMjAyMyIpClJSdGJsJT4lZ3QoKSU+JXRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJUYWJsZSAzLjEuNDogUmVsYXRpdmUgcmlza3MgZm9yIHRocmVlIHllYXJzIikKYGBgClRhYmxlIDMuMS40IHNob3dlZCB0aGUgUmVsYXRpdmUgcmlza3MgaW4gMjAyMSwyMDIyIGFuZCAyMDIzLiBXZSBjYW4gc2VlIHRoYXQgcmVsYXRpdmUgcmlza3MgaW4gMjAyMSxhbmQgMjAyMyBhcmUgbGVzcyB0aGFuIDEsIHdlIGNhbiBjb25jbHVkZWQgdGhhdCBpZiBhIHBlb3BsZSBkaWVkIGluIENPVklELTE5LCB0aGlzIHBlb3BsZSBpcyBtb3JlIGxpa2VseSBkaWVkIGluIDIwMjAgdGhhbiAyMDIxIGFuZCAyMDIzLiBUaGUgcmVsYXRpdmUgcmlzayBpbiAyMDIyIGFyZSBncmVhdGVyIHRoYW4gMSwgd2UgY2FuIGNvbmNsdWRlZCB0aGF0IGlmIGEgcGVvcGxlIGRpZWQgaW4gQ09WSUQtMTksIHRoaXMgcGVvcGxlIGlzIG1vcmUgbGlrZWx5IGRpZWQgaW4gMjAyMiB0aGFuIDIwMjAuCgpgYGB7cn0KI09kZHMgcmF0aW9zClRibDwtYXMubWF0cml4KHRibFssYygyLDMpXSkKT1IyMT1yb3VuZChUYmxbMSwxXSpUYmxbMiwyXS8oVGJsWzEsMl0qVGJsWzIsMV0pLDQpCk9SMjI9cm91bmQoVGJsWzEsMV0qVGJsWzMsMl0vKFRibFsxLDJdKlRibFszLDFdKSw0KQpPUjIzPXJvdW5kKFRibFsxLDFdKlRibFs0LDJdLyhUYmxbMSwyXSpUYmxbNCwxXSksNCkKT1J0Ymw8LWRhdGEuZnJhbWUoIk9kZHMgUmF0aW8iLE9SMjEsT1IyMixPUjIzKQpjb2xuYW1lcyhPUnRibCk8LWMoIlllYXIiLCAiMjAyMSIsICIyMDIyIiwiMjAyMyIpCk9SdGJsJT4lZ3QoKSU+JXRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJUYWJsZSAzLjEuNTogT2RkcyByYXRpbyBmb3IgdGhyZWUgeWVhcnMiKQpgYGAKRnJvbSBUYWJsZSAzLjEuNSwgd2UgY2FuIHNlZSB0aGF0IHRoZSBvZGRzIHJhdGlvcyBmb3IgYWxsIHRocmVlIHllYXJzIGFyZSBub3QgZXF1YWwgdG8gMSwgd2hpY2ggaW5kaWNhdGVkIHRoYXQgdGhlcmUgZXhpc3RzIGFzc29jaWF0aW9uIGJldHdlZW4geWVhciBhbmQgQ09WSUQtMTkgZGVhdGggcHJvcG9ydGlvbi4gRm9yIG9kZHMgcmF0aW9zIGluIDIwMjEgYW5kIDIwMjMsIHRoZXJlIGV4aXN0IHBvc2l0aXZlIGFzc29jaWF0aW9uIGJldHdlZW4gcHJvYmFiaWxpdHkgb2YgZGVhdGggY2F1c2VkIGJ5IENPVklELTE5LiBUaGUgYXNzb2NpYXRpb24gaW4gMjAyMiBpcyBuZWdhdGl2ZSBiZXR3ZWVuIHByb3BvcnRpb24gb2YgQ09WSUQtMTkgZGVhdGggaW4gdG90YWwgZGVhdGguICAgCgojIyBMb25nLXRlcm0gSW1wYWN0CgpBcyB0aGUgZGF0YSBvZiBDT1ZJRC0xOSBsb25nIHRlcm0gc3ltcHRvbSBhbW9uZyBDYW5hZGlhbiBhZHVsdHMgZGlkIG5vdCBjb250YWluIHRoZSBwb3B1bGF0aW9uIHNpemUgYW5kIHBvcHVsYXRpb24gZm9yIGVhY2ggZ3JvdXBzLiBXZSBlc3RpbWF0ZSB0aGUgY291bnRzIGZyb20gdGhlIGRhdGEgb2YgV2Vla2x5IG51bWJlciBvZiBDT1ZJRC0xOSBjYXNlcyBpbiBDYW5hZGEgYXMgb2YgT2N0b2JlciAyOCwgMjAyMy4gRnJvbSB0aGUgZGF0YSBvZiBvdmVyYWxsIENPVklELTE5IGNhc2VzLCB3ZSBmaXJzdCBncm91cGVkIHRoZSBkYXRhIHRvIHRoZSBzaW1pbGFyIHN0cnVjdHVyZSBhcyBvdXIgTG9uZyBUZXJtIFN5bXB0b20gZGF0YS4gVGhlIGRhdGEgb2Ygb3RoZXIgZ2VuZGVycyB3YXMgZHJvcHBlZCBiZWNhdXNlIHRoYXQgdGhlIGNvdW50IGlzIHRvbyBzbWFsbCBjb21wYXJpbmcgdG8gdGhlIHRvdGFsIHBvcHVsYXRpb24uCmBgYHtyfQojZ3JvdXAgdGhlIGxvbmd0ZXJtIGRhdGEgYW5kIGRyb3AgdmFyaWFibGVzIG5vdCB1c2VkIGluIHRoZSBhbmFseXNpcwpncm91cGVkX2RhdGEgPC0gTG9uZ1Rlcm0gJT4lCiAgZmlsdGVyKENoYXJhY3RlcmlzdGljcyA9PSAnUGVyY2VudCcpICU+JQogIGdyb3VwX2J5KFNleCwgQWdlLmdyb3VwLCBNZWFzdXJlcykgJT4lCiAgc3VtbWFyaXNlKFZBTFVFLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUgCiAgc3ByZWFkKE1lYXN1cmVzLCBWQUxVRSkKCiNjbGVhbiB0aGUgY292aWQgY2FzZXMgZGF0YSBieSBhZ2UgYW5kIGdlbmRlcgpjbGVhbmVkX2RhdGEgPC0gQ292aWRfYUcgJT4lCiAgc2VsZWN0KC1yYXRlX3Blcl8xMDAwMDApICU+JQogIGZpbHRlcihzdGF0dXMgIT0gJ2RlYXRocycsIAogICAgICAgICBhZ2VfZ3JvdXAgIT0gJ2FsbCcsIAogICAgICAgICBnZW5kZXIgIT0gJ2FsbCcsCiAgICAgICAgIGdlbmRlciAhPSAnb3RoZXInKSAlPiUKICBuYS5vbWl0KCkKCiNtYXRjaCB0aGUgYWdlIGdyb3VwcyBjYXRlZ29yaWVzIHdpdGggbG9uZ3Rlcm0KbWFwX2FnZV9ncm91cCA8LSBmdW5jdGlvbihhZ2VfZ3JvdXApIHsKICBjYXNlX3doZW4oCiAgICBhZ2VfZ3JvdXAgJWluJSBjKCIyMCB0byAyOSIsICIzMCB0byAzOSIpIH4gIkFnZXMgMTggdG8gMzQiLAogICAgYWdlX2dyb3VwICVpbiUgYygiNDAgdG8gNDkiKSB+ICJBZ2VzIDM1IHRvIDQ5IiwKICAgIGFnZV9ncm91cCAlaW4lIGMoIjUwIHRvIDU5IiwgIjYwIHRvIDY5IikgfiAiQWdlcyA1MCB0byA2NCIsCiAgICBhZ2VfZ3JvdXAgJWluJSBjKCI3MCB0byA3OSIsICI4MCsiKSB+ICJBZ2VzIDY1IGFuZCBvdmVyIiwKICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfIAogICkKfQoKI21hdGNoIHRoZSBzZXggY2F0ZWdvcmllcwpzdW1tYXJ5X2RhdGEgPC0gY2xlYW5lZF9kYXRhICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSBtYXBfYWdlX2dyb3VwKGFnZV9ncm91cCkpICU+JQogIG11dGF0ZShnZW5kZXIgPSBjYXNlX3doZW4oCiAgICBnZW5kZXIgPT0gJ21hbGUnIH4gJ01hbGVzJywKICAgIGdlbmRlciA9PSAnZmVtYWxlJyB+ICdGZW1hbGVzJywKICAgIFRSVUUgfiBnZW5kZXIKICApKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZV9ncm91cCkpICU+JQogIGdyb3VwX2J5KGdlbmRlcixhZ2VfZ3JvdXApICU+JQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCksIC5ncm91cHMgPSAnZHJvcCcpCgojdG90YWwgZm9yIGFnZXMKYWdlc18xOF9hbmRfb3ZlciA8LSBzdW1tYXJ5X2RhdGEgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBzdW0oY291bnQpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gJ0FnZXMgMTggYW5kIG92ZXInKQoKc3VtbWFyeV9kYXRhIDwtIGJpbmRfcm93cyhzdW1tYXJ5X2RhdGEsIGFnZXNfMThfYW5kX292ZXIpCgojYm90aCBzZXhlcwpib3RoX3NleGVzX2RhdGEgPC0gc3VtbWFyeV9kYXRhICU+JQogIGZpbHRlcihnZW5kZXIgJWluJSBjKCdNYWxlcycsICdGZW1hbGVzJykpICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCkgJT4lCiAgc3VtbWFyaXNlKGNvdW50ID0gc3VtKGNvdW50KSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgbXV0YXRlKGdlbmRlciA9ICdCb3RoIHNleGVzJykKCmZpbmFsX3N1bW1hcnlfZGF0YSA8LSByYmluZChzdW1tYXJ5X2RhdGEsIGJvdGhfc2V4ZXNfZGF0YSkKZmluYWxfc3VtbWFyeV9kYXRhIDwtIGZpbmFsX3N1bW1hcnlfZGF0YSAlPiUKICBhcnJhbmdlKGdlbmRlciwgYWdlX2dyb3VwKSAlPiUKICByZW5hbWUoU2V4ID0gZ2VuZGVyLCBBZ2UuZ3JvdXAgPSBhZ2VfZ3JvdXApCgojY29tYmluZSBsb25ndGVybSBwcm9wb3J0aW9uIGRhdGEgd2l0aCB0aGUgZ3JvdXAgY291bnRzCmNvbWJpbmVkX2RhdGEgPC0gbGVmdF9qb2luKGdyb3VwZWRfZGF0YSwgZmluYWxfc3VtbWFyeV9kYXRhLCBieSA9IGMoIlNleCIsICJBZ2UuZ3JvdXAiKSkKYGBgCgpUaGUgZGF0YSBpcyBmaXJzdCBncm91cGVkIGJ5IHNleCB3aGljaCBjb25zaXN0cyBvZiAibWFsZXMiLCAiZmVtYWxlcyIsIGFuZCAiQm90aCBzZXhlcyIuICJCb3RoIHNleGVzIiBncm91cCBjb250YWluIHRoZSBjb21iaW5lZCBkYXRhIGZyb20gYm90aCBtYWxlcyBhbmQgZmVtYWxlcy4gVGhlbiB0aGUgZGF0YSBpcyBmdXJ0aGVyIGdyb3VwZWQgYnkgYWdlIGdyb3Vwcy4gU3ViZ3JvdXAgIkFnZXMgMTggYW5kIG92ZXIiIGhhcyB0aGUgdG90YWwgY291bnQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHNleCBncm91cC4gVGhlIHByb3BvcnRpb24gdGFibGUgd2l0aCB0b3RhbCBjb3VudCBvZiBzdWJncm91cHMgaXMgc2hvd24gaW4gdGhlIFRhYmxlIDMuMi4xIGJlbG93LgpgYGB7cn0KZ3RfdGFibGUgPC0gY29tYmluZWRfZGF0YSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIoCiAgICB0aXRsZSA9IG1kKCIqKlRhYmxlIDMuMi4xOkNvbWJpbmVkIERhdGEgU2hvd2luZyBQcm9wb3J0aW9ucyBhbmQgQ291bnRzIGJ5IFNleCBhbmQgQWdlKioiKQogICkgJT4lCiAgY29sc19sYWJlbCgKICAgIFNleCA9ICJTZXgiLAogICAgYEFnZS5ncm91cGAgPSAiQWdlIEdyb3VwIiwKICAgIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgID0gIlllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tcyAoUGVyY2VudCkiLAogICAgYE5vLCBkaWQgbm90IGhhdmUgbG9uZy10ZXJtIHN5bXB0b21zYCA9ICJObywgZGlkIG5vdCBoYXZlIGxvbmctdGVybSBzeW1wdG9tcyAoUGVyY2VudCkiLAogICAgY291bnQgPSAiQ291bnQiCiAgKSAlPiUKICB0YWJfc3R5bGUoCiAgICBzdHlsZSA9IGxpc3QoCiAgICAgIGNlbGxfYm9yZGVycyhzaWRlcyA9ICJib3R0b20iLCB3ZWlnaHQgPSBweCgyKSkKICAgICksCiAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KAogICAgICByb3dzID0gY29tYmluZWRfZGF0YSRTZXggIT0gZHBseXI6OmxlYWQoY29tYmluZWRfZGF0YSRTZXgpCiAgICApCiAgKSAlPiUKICB0YWJfc3R5bGUoCiAgICBzdHlsZSA9IGxpc3QoCiAgICAgIGNlbGxfZmlsbChjb2xvciA9ICJsaWdodGdyZXkiKSwgCiAgICAgIGNlbGxfdGV4dCh3ZWlnaHQgPSAiYm9sZCIpCiAgICApLAogICAgbG9jYXRpb25zID0gY2VsbHNfY29sdW1uX2xhYmVscyhjb2x1bW5zID0gVFJVRSkKICApICU+JQogIHRhYl9zdHlsZSgKICAgIHN0eWxlID0gY2VsbF90ZXh0KGFsaWduID0gImNlbnRlciIpLCAKICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGMoMyw0KSkKICApCgppbnZpc2libGUocHJpbnQoZ3RfdGFibGUpKQpgYGAKRnJvbSB0aGUgVGFibGUgMy4yLjEsIHdlIGZpbmQgdGhhdCBmb3IgZmVtYWxlcywgaGlnaGVyIHByb3BvcnRpb24oMjQuNCUpIG9mIHJlc3BvbmRlbnRzIGZyb20gYWdlIDY1IGFuZCBvdmVyIHJlcG9ydGVkIGxvbmcgdGVybSBzeW1wdG9tcy4gV2hpbGUgbWFsZXMgZnJvbSBhZ2VzIDE4IHRvIDM0IHNob3cgYSBoaWdoZXIgcHJvcG9ydGlvbigxMyUpIHRvIHJlcG9ydCBsb25nIHRlcm0gc3ltcHRvbXMuIE92ZXJhbGwoYm90aCBzZXhlcyksIGhpZ2hlciBwcm9wb3J0aW9uKDE3LjglKSBvZiBhZHVsdHMgZnJvbSBhZ2VzIDY1IGFuZCBvdmVyIHJlcG9ydGVkIGxvbmcgdGVybSBzeW1wdG9tcy4gRm9yIGFsbCBhZ2UgZ3JvdXBzLCAyMC4xJSBvZiBmZW1hbGVzIHJlcG9ydGVkIGxvbmcgdGVybSBzeW1wdG9tcyBjb21wYXJpbmcgdG8gb25seSAxMiUgb2YgbWFsZXMuCgpUbyBzdHVkeSB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhZ2UgZ3JvdXBzIGFuZCB0aGUgbG9uZyB0ZXJtIHN5bXB0b21zLCBBIENoaS1zcXVhcmUgdGVzdCB3YXMgY29uZHVjdGVkIHdpdGhpbiBlYWNoIHNleCBncm91cC4gVGhlIGh5cG90aGVzaXMgb2YgaW5kZXBlbmRlbmNlIGNvcnJlc3BvbmRzIHRvICRIXzA6cF97aWp9PXBfe2lcY2RvdH1wX3tcY2RvdCBqfSwgXGZvcmFsbCBpLGokLiBVbmRlciBlYWNoIHNleCBncm91cCwgYSAkNFx0aW1lczIkIGNvbnRpbmdlbmN5IGlzIGNvbnN0cnVjdGVkLiBXZSBoYXZlIGFnZSBncm91cHMgYXMgdGhlIHJvdyB2YXJpYWJsZSAsIHJlc3BvbnNlIG9mIGxvbmcgdGVybSBzeW1wdG9tcyBhcyB0aGUgY29sdW1uIHZhcmlhYmxlLiBDb3VudHMgZm9yIHNwZWNpZmljIHJlc3BvbnNlcyAiWWVzLCBoYWQgbG9uZy10ZXJtIHN5bXB0b21zIiBhbmQgIk5vLCBkaWQgbm90IGhhdmUgbG9uZy10ZXJtIHN5bXB0b21zIiBhcmUgZXN0aW1hdGVkIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIHByb3BvcnRpb24gYW5kIHRoZSB0b3RhbCBjb3VudHMgb2YgZWFjaCBzdWJncm91cC4gCgpBIHNpbWlsYXIgQ2hpLXNxdWFyZSB0ZXN0IHdhcyBhcHBsaWVkIHRvIHRlc3QgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gc2V4IGFuZCB0aGUgbG9uZyB0ZXJtIHN5bXB0b21zLiBVbmRlciBlYWNoIGFnZSBncm91cCwgYSAkMlx0aW1lczIkIGNvbnRpbmdlbmN5IHRhYmxlIGlzIGNvbnN0cnVjdGVkIHdpdGggc2V4IGFzIHRoZSByb3cgdmFyaWFibGUgYW5kIGxvbmcgdGVybSBzeW1wdG9tcyBhcyB0aGUgY29sdW1uIHZhcmlhYmxlLiAKClRlc3QgcmVzdWx0cyBhcmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZS4KYGBge3J9CmxpYnJhcnkoYnJvb20pCnBlcmZvcm1fY2hpX3NxdWFyZTEgPC0gZnVuY3Rpb24oZGF0YSkgewogIGZpbHRlcmVkX2RhdGEgPC0gZGF0YSAlPiUgCiAgICBmaWx0ZXIoYEFnZS5ncm91cGAgIT0gIkFnZXMgMTggYW5kIG92ZXIiKQoKICBjb250aW5nZW5jeV90YWJsZSA8LSBmaWx0ZXJlZF9kYXRhICU+JQogICAgc2VsZWN0KGBBZ2UuZ3JvdXBgLCBgWWVzLCBoYWQgbG9uZy10ZXJtIHN5bXB0b21zYCwgY291bnQpICU+JQogICAgbXV0YXRlKE5vID0gcm91bmQoKDEwMCAtIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgKSAqIGNvdW50IC8gMTAwKSwKICAgICAgICAgICBZZXMgPSByb3VuZChgWWVzLCBoYWQgbG9uZy10ZXJtIHN5bXB0b21zYCAqIGNvdW50IC8gMTAwKSkgJT4lCiAgICBzZWxlY3QoLWBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgLC1gY291bnRgKSAlPiUKICAgIGdyb3VwX2J5KGBBZ2UuZ3JvdXBgKQoKICBjaGlfc3F1YXJlX3Jlc3VsdCA8LSBjaGlzcS50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlWy0xXSkKICAKICByZXR1cm4oY2hpX3NxdWFyZV9yZXN1bHQpCn0KCnJlc3VsdHMxIDwtIGxpc3QoKQpzZXhlcyA8LSBjKCJNYWxlcyIsICJGZW1hbGVzIiwgIkJvdGggc2V4ZXMiKQpmb3IgKHNleCBpbiBzZXhlcykgewogIGZpbHRlcmVkX2RhdGEgPC0gY29tYmluZWRfZGF0YSAlPiUgZmlsdGVyKFNleCA9PSBzZXgpCiAgcmVzdWx0czFbW3NleF1dIDwtIHBlcmZvcm1fY2hpX3NxdWFyZTEoZmlsdGVyZWRfZGF0YSkKfQoKdGVzdF9yZXN1bHRzMSA8LSBsYXBwbHkocmVzdWx0czEsIHRpZHkpICU+JSBiaW5kX3Jvd3MoKSAlPiUgbXV0YXRlKFNleCA9IHNleGVzKQp0ZXN0X3Jlc3VsdHMxIDwtIHNlbGVjdCh0ZXN0X3Jlc3VsdHMxLCBTZXgsIHN0YXRpc3RpYywgcC52YWx1ZSkKCnNpZ25pZmljYW5jZV9sZXZlbCA8LSAwLjA1CgpyZXN1bHRfdGFibGUxIDwtIHRlc3RfcmVzdWx0czEgJT4lCiAgZ3QoKSAlPiUKICB0YWJfaGVhZGVyKAogICAgdGl0bGUgPSBtZCgiKipUYWJsZSAzLjIuMjogQ2hpLVNxdWFyZWQgVGVzdCBSZXN1bHRzIG9mIEFnZSBncm91cHMgYW5kIExvbmcgdGVybSBzeW1wdG9tcyoqIikKICApICU+JQogIGNvbHNfbGFiZWwoCiAgICBTZXggPSAiU2V4IiwKICAgIHN0YXRpc3RpYyA9ICJDaGktU3F1YXJlZCBTdGF0aXN0aWMiLAogICAgcC52YWx1ZSA9ICJQLVZhbHVlIgogICkgJT4lCiAgZm10X251bWJlcigKICAgIGNvbHVtbnMgPSB2YXJzKHN0YXRpc3RpYywgcC52YWx1ZSksCiAgICBkZWNpbWFscyA9IDMKICApICU+JQogIGZtdCgKICAgIGNvbHVtbnMgPSB2YXJzKHAudmFsdWUpLAogICAgZm5zID0gZnVuY3Rpb24oeCkgewogICAgICBpZmVsc2UoeCA8IHNpZ25pZmljYW5jZV9sZXZlbCwgcGFzdGUoIjwiLCBzaWduaWZpY2FuY2VfbGV2ZWwpLCBzcHJpbnRmKCIlLjNmIiwgeCkpCiAgICB9CiAgKQoKaW52aXNpYmxlKHByaW50KHJlc3VsdF90YWJsZTEpKQpgYGAKVGFibGUgMy4yLjIgc2hvd3MgdGhlIHJlc3VsdHMgb2YgQ2hpLXNxdWFyZWQgdGVzdHMgY29tcGFyaW5nIHRoZSBPY2N1cnJlbmNlIG9mIGxvbmctdGVybSBDT1ZJRC0xOSBzeW1wdG9tcyBhY3Jvc3MgZGlmZmVyZW50IGFnZSBncm91cHMgd2l0aGluIGVhY2ggc2V4IGNhdGVnb3J5IGFuZCBmb3IgYm90aCBzZXhlcyBjb21iaW5lZC5Gb3IgYWxsIGNhdGVnb3JpZXMgKE1hbGVzLCBGZW1hbGVzLCBhbmQgQm90aCBTZXhlcyksIHRoZSBDaGktc3F1YXJlZCBzdGF0aXN0aWNzIGFyZSBoaWdoLCBhbmQgdGhlIHAtdmFsdWVzIGFyZSBsZXNzIHRoYW4gMC4wNS5UaGlzIHN1Z2dlc3RzIHRoYXQgd2l0aGluIGVhY2ggb2YgdGhlc2UgY2F0ZWdvcmllcywgdGhlcmUgaXMgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGFzc29jaWF0aW9uIGJldHdlZW4gYWdlIGdyb3VwIGFuZCB0aGUgb2NjdXJyZW5jZSBvZiBsb25nLXRlcm0gQ09WSUQtMTkgc3ltcHRvbXMuIFRoZSBkaWZmZXJlbmNlcyBpbiBzeW1wdG9tIGZyZXF1ZW5jaWVzIGFjcm9zcyBhZ2UgZ3JvdXBzIGFyZSBub3QgbGlrZWx5IHRvIGJlIGR1ZSB0byByYW5kb20gY2hhbmNlLgoKYGBge3J9CnBlcmZvcm1fY2hpX3NxdWFyZTIgPC0gZnVuY3Rpb24oZGF0YSwgYWdlX2dyb3VwKSB7CiAgZmlsdGVyZWRfZGF0YSA8LSBkYXRhICU+JQogICAgZmlsdGVyKGBBZ2UuZ3JvdXBgID09IGFnZV9ncm91cCwgU2V4ICE9ICJCb3RoIHNleGVzIikKCiAgY29udGluZ2VuY3lfdGFibGUgPC0gZmlsdGVyZWRfZGF0YSAlPiUKICAgIHNlbGVjdChTZXgsIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgLCBjb3VudCkgJT4lCiAgICBtdXRhdGUoTm8gPSByb3VuZCgoMTAwIC0gYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2ApICogY291bnQgLyAxMDApLAogICAgICAgICAgIFllcyA9IHJvdW5kKGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgICogY291bnQgLyAxMDApKSAlPiUKICAgIHNlbGVjdCgtYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2AsLWBjb3VudGApICU+JQogICAgZ3JvdXBfYnkoU2V4KQoKICBjaGlfc3F1YXJlX3Jlc3VsdCA8LSBjaGlzcS50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlWy0xXSkKCiAgcmV0dXJuKGNoaV9zcXVhcmVfcmVzdWx0KQp9CgphZ2VfZ3JvdXBzIDwtIHVuaXF1ZShjb21iaW5lZF9kYXRhJEFnZS5ncm91cCkKCnJlc3VsdHMyIDwtIGxpc3QoKQpmb3IgKGFnZSBpbiBhZ2VfZ3JvdXBzKSB7CiAgcmVzdWx0czJbW2FnZV1dIDwtIHBlcmZvcm1fY2hpX3NxdWFyZTIoY29tYmluZWRfZGF0YSwgYWdlKQp9Cgp0ZXN0X3Jlc3VsdHMyIDwtIGxhcHBseShyZXN1bHRzMiwgdGlkeSkgJT4lIGJpbmRfcm93cygpICU+JSBtdXRhdGUoYEFnZS5ncm91cGAgPSBhZ2VfZ3JvdXBzKQp0ZXN0X3Jlc3VsdHMyIDwtIHNlbGVjdCh0ZXN0X3Jlc3VsdHMyLCBgQWdlLmdyb3VwYCwgc3RhdGlzdGljLCBwLnZhbHVlKQoKcmVzdWx0X3RhYmxlMiA8LSB0ZXN0X3Jlc3VsdHMyICU+JQogIGd0KCkgJT4lCiAgdGFiX2hlYWRlcigKICAgIHRpdGxlID0gbWQoIioqVGFibGUgMy4yLjM6IENoaS1TcXVhcmVkIFRlc3QgUmVzdWx0cyBvZiBTZXggYW5kIExvbmcgdGVybSBzeW1wdG9tcyoqIikKICApICU+JQogIGNvbHNfbGFiZWwoCiAgICBgQWdlLmdyb3VwYCA9ICJBZ2UgR3JvdXAiLAogICAgc3RhdGlzdGljID0gIkNoaS1TcXVhcmVkIFN0YXRpc3RpYyIsCiAgICBwLnZhbHVlID0gIlAtVmFsdWUiCiAgKSAlPiUKICBmbXRfbnVtYmVyKAogICAgY29sdW1ucyA9IHZhcnMoc3RhdGlzdGljKSwKICAgIGRlY2ltYWxzID0gMwogICkgJT4lCiAgZm10KAogICAgY29sdW1ucyA9IHZhcnMocC52YWx1ZSksCiAgICBmbnMgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmZWxzZSh4IDwgMC4wNSwgcGFzdGUoIjwgMC4wNSIpLCBzcHJpbnRmKCIlLjNmIiwgeCkpCiAgICB9CiAgKQoKaW52aXNpYmxlKHByaW50KHJlc3VsdF90YWJsZTIpKQpgYGAKVGFibGUgMy4yLjMgcHJlc2VudHMgdGhlIHJlc3VsdHMgb2YgQ2hpLXNxdWFyZWQgdGVzdHMgY29tcGFyaW5nIHRoZSBvY2N1cnJlbmNlIG9mIGxvbmctdGVybSBDT1ZJRC0xOSBzeW1wdG9tcyBiZXR3ZWVuIG1hbGVzIGFuZCBmZW1hbGVzIHdpdGhpbiBlYWNoIGFnZSBncm91cC5FYWNoIGFnZSBncm91cCBzaG93cyBhIHZlcnkgaGlnaCBDaGktc3F1YXJlZCBzdGF0aXN0aWMgd2l0aCBhbGwgcC12YWx1ZXMgYmVpbmcgbGVzcyB0aGFuIDAuMDUuIFRoZXNlIHJlc3VsdHMgaW5kaWNhdGUgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGFzc29jaWF0aW9uIGJldHdlZW4gc2V4IGFuZCB0aGUgb2NjdXJyZW5jZSBvZiBsb25nLXRlcm0gQ09WSUQtMTkgc3ltcHRvbXMgaW4gZWFjaCBhZ2UgZ3JvdXAuCgpUbyBmdXJ0aGVyIGV4cGxvcmUgdGhlIHN0cmVuZ3RoIG9mIHRoZSBhc3NvY2lhdGlvbi4gV2UgY2FsY3VsYXRlZCBvZGRzIHJhdGlvcyBwcmltYXJpbHkgYmV0d2VlbiBtYWxlcyBhbmQgZmVtYWxlcyBpbiBlYWNoIGFnZSBncm91cC4gRm9yIGVhY2ggYWdlIGdyb3VwLCB0aGUgb2RkcyBvZiBmZW1hbGVzIGV4cGVyaWVuY2luZyBsb25nLXRlcm0gc3ltcHRvbXMgYXJlIGNvbXBhcmVkIHRvIHRoZSBvZGRzIGZvciBtYWxlcy4gQW4gT1IgZ3JlYXRlciB0aGFuIDEgaW5kaWNhdGVzIGEgaGlnaGVyIGxpa2VsaWhvb2QgZm9yIGZlbWFsZXMuIFRoZSByZXN1bHRzIGFyZSBzaG93biBpbiBUYWJsZSAzLjIuNC4KYGBge3J9CmNvbnRpbmdlbmN5X3RhYmxlcyA8LSBjb21iaW5lZF9kYXRhICU+JQogICNmaWx0ZXIoYEFnZS5ncm91cGAgIT0gIkFnZXMgMTggYW5kIG92ZXIiKSAlPiUKICBmaWx0ZXIoIFNleCAhPSAiQm90aCBzZXhlcyIpICU+JQogIHNlbGVjdChgU2V4YCwgYEFnZS5ncm91cGAsIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgLCBjb3VudCkgJT4lCiAgbXV0YXRlKE5vID0gcm91bmQoKDEwMCAtIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgKSAqIGNvdW50IC8gMTAwKSwKICAgICAgICAgWWVzID0gcm91bmQoYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2AgKiBjb3VudCAvIDEwMCkpICU+JQogIHNlbGVjdCgtYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2AsIC1jb3VudCkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKCJZZXMiLCAiTm8iKSwgbmFtZXNfdG8gPSAiUmVzcG9uc2UiLCB2YWx1ZXNfdG8gPSAiQ291bnQiKSAlPiUKICBncm91cF9ieShgQWdlLmdyb3VwYCwgYFNleGAsIFJlc3BvbnNlKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9ICJSZXNwb25zZSIsIHZhbHVlc19mcm9tID0gIkNvdW50IikKCmNvbnRpbmdlbmN5X3RhYmxlcyA8LSBjb250aW5nZW5jeV90YWJsZXMgJT4lCiAgbXV0YXRlKE9kZHMgPSBZZXMgLyBObykKCm9kZHNfcmF0aW9zIDwtIGNvbnRpbmdlbmN5X3RhYmxlcyAlPiUKICBncm91cF9ieShBZ2UuZ3JvdXApICU+JQogIHN1bW1hcmlzZShPZGRzUmF0aW8gPSBPZGRzW1NleCA9PSAiRmVtYWxlcyJdIC8gT2Rkc1tTZXggPT0gIk1hbGVzIl0pICU+JQogIHVuZ3JvdXAoKQoKT1JfdGFibGUgPC0gb2Rkc19yYXRpb3MgJT4lCiAgZ3QoKSAlPiUKICB0YWJfaGVhZGVyKAogICAgdGl0bGUgPSBtZCgiKipUYWJsZSAzLjIuNDogT2RkcyBSYXRpb3Mgb2YgTG9uZy10ZXJtIENPVklELTE5IFN5bXB0b21zOiBGZW1hbGVzIHZzIE1hbGVzIGJ5IEFnZSBHcm91cCoqIikKICApICU+JQogIGNvbHNfbGFiZWwoCiAgICBBZ2UuZ3JvdXAgPSAiQWdlIEdyb3VwIiwKICAgIE9kZHNSYXRpbyA9ICJPZGRzIFJhdGlvIgogICkgJT4lCiAgZm10X251bWJlcigKICAgIGNvbHVtbnMgPSB2YXJzKE9kZHNSYXRpbyksCiAgICBkZWNpbWFscyA9IDMKICApCgppbnZpc2libGUocHJpbnQoT1JfdGFibGUpKQoKYGBgCkFjcm9zcyBhbGwgYWdlIGdyb3VwcywgZmVtYWxlcyBhcmUgY29uc2lzdGVudGx5IG1vcmUgbGlrZWx5IHRoYW4gbWFsZXMgdG8gcmVwb3J0IGxvbmctdGVybSBDT1ZJRC0xOSBzeW1wdG9tcywgYXMgaW5kaWNhdGVkIGJ5IG9kZHMgcmF0aW9zIGdyZWF0ZXIgdGhhbiAxIGluIGVhY2ggY2F0ZWdvcnkuIFRoZSBvZGRzIHJhdGlvcyBzZWVtIHRvIGluY3JlYXNlIHdpdGggYWdlLiBUaGUgaGlnaGVzdCBkaXNwYXJpdHkgYmV0d2VlbiBmZW1hbGVzIGFuZCBtYWxlcyBpcyBvYnNlcnZlZCBpbiB0aGUgb2xkZXN0IGFnZSBncm91cCAoQWdlcyA2NSBhbmQgb3ZlcikuCgojIyBQcmV2YWxlbmNlIE1vZGVsaW5nCgpUaGUgaHlwb3RoZXNpcyB3ZSB3ZXJlIG1vc3RseSBpbnRlcmVzdGVkIGluIHdhczoKClxiZWdpbntnYXRoZXIqfQpIXzA6IFxiZXRhX2ogPSAwIFxcCkhfMDogXGJldGFfaiBcbmVxIDAKXGVuZHtnYXRoZXIqfQoKZm9yIGVhY2ggY29lZmZpY2llbnQgcmVsYXRlZCB0byBpdHMgY29ycmVzcG9uZGluZyBjb3ZhcmlhdGUuIEluIG90aGVyIHdvcmRzLCB3ZSB3YW50ZWQgdG8gZGVzY3JpYmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBDT1ZJRCBzdGF0dXMgb2YgYSBwYXJ0aWNpcGFudCBhbmQgb3RoZXIgcHJlZGljdG9ycy4gV2Ugc2VsZWN0ZWQgdGhlIG1vZGVsIHdpdGggdGhlIGxlYXN0IEFJQyB2YWx1ZSBzaG93biBpbiBUYWJsZSAzLjMuMS4KYGBge3J9Clh5PC1SZWdyZXNzaW9uRGF0YVssMjoxNF0lPiVtdXRhdGUoeT1SZWdyZXNzaW9uRGF0YSRDb3ZpZF9TdGF0dXMpJT4lbmEub21pdCgpCk1vZGVsczwtYmVzdGdsbShYeSxmYW1pbHk9Ymlub21pYWwsSUM9YygiQUlDIikpIApgYGAKCmBgYHtyfQpmaXRzPC10KHJiaW5kKE1vZGVscyRTdWJzZXRzWywxOjE0XSwgbj1jb2xTdW1zKE1vZGVscyRTdWJzZXRzWywxOjE0XSkpKQpmaXRzPC1jYmluZChhcy5kYXRhLmZyYW1lKGZpdHNbb3JkZXIoZml0c1ssIm4iXSwgZGVjcmVhc2luZyA9IFRSVUUpLC0xNV0lPiV0KCkpLCBNb2RlbHMkU3Vic2V0c1ssMTU6MTZdKQoKZml0cyU+JWd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMy4zLjE6IENvbXBsZXRlIExpc3Qgb2YgTW9kZWxzIEZvciBDT1ZJRCBTdGF0dXMgRXN0aW1hdGlvbiIpJT4ldGFiX29wdGlvbnMoY29udGFpbmVyLndpZHRoID0gMTQwMCwgdGFibGUuYWxpZ249ImxlZnQiKSU+JQogIHRhYl9zdHlsZShzdHlsZSA9IGxpc3QoY2VsbF9maWxsKGNvbG9yID0gImxpZ2h0Ymx1ZSIpKSwgbG9jYXRpb25zID0gY2VsbHNfYm9keShyb3dzID0gNSkpCmBgYAoKT3VyIGJlc3QgbW9kZWwgaGFkIHRoZSBmb2xsb3dpbmcgY29lZmZpY2llbnRzIHNob3duIGluIHRoZSBzdW1tYXJ5IFRhYmxlIDMuMy4yLCBmcm9tIHdoaWNoIHdlIGZvdW5kIHRoYXQgdGhlIHZhcmlhYmxlIEZsdVZhYyB0aGF0IGluZGljYXRlZCB3aGV0aGVyIG9yIG5vdCB0aGUgcGFydGljaXBhbnQgaGFkIGEgZmx1IHNob3QgZm9yIHRoZSBwYXN0IDEyIG1vbnRocyBoYWQgYSBwLXZhbHVlID0gMC4xNTUgbm90IHNpZ25pZmljYW50IGVub3VnaCwgc28gd2UgZGlkIG5vdCBoYXZlIGEgY29uY2x1c2lvbiBvbiB3aGV0aGVyIHRoZSB2YXJpYWJsZSB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNwb25zZS4KCmBgYHtyfQpNb2RlbHMkQmVzdE1vZGVsJT4lc3RhcmdhemVyKHR5cGUgPSAidGV4dCIsIHRpdGxlPSJUYWJsZSAzLjMuMjogU3VtbWFyeSBvZiBNb2RlbCB3aXRoIExvd2VzdCBBSUMiLCBkZXAudmFyLmxhYmVscyA9IGMoIkNvdmlkXFxfU3RhdHVzIiksIHJlcG9ydD0oInZjKnMqcCIpKQpgYGAKCldlIGxvb2tlZCBhdCB0aGUgQUlDIHdoZW4gdGhlIGZsdSB2YWNjaW5lIHN0YXR1cyB2YXJpYWJsZSB3YXMgcmVtb3ZlZC4gT25lIGNhbiBzZWUgaW4gVGFibGUgMy4zLjMgYmVsb3cgdGhhdCB0aGVyZSB3YXMgbm90IG11Y2ggZGlmZmVyZW5jZSBpbiB0aGUgQUlDIHZhbHVlLiBGb3IgbW9kZWwgc2ltcGxpY2l0eSB3ZSB0aGVyZWZvcmUgb21pdHRlZCB0aGUgdmFyaWFibGUuIAoKYGBge3J9Ck1vZGVscyRCZXN0TW9kZWxzWzE6MixdJT4lZ3QoKSU+JXRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJUYWJsZSAzLjMuMzogTW9kZWwgQUlDIENvbXBhcmlzb24gd2l0aCBGbHVWYWMgUmVtb3ZlZCIpJT4ldGFiX29wdGlvbnMoY29udGFpbmVyLndpZHRoID0gMTQwMCwgdGFibGUuYWxpZ249ImxlZnQiKSU+JQogIHRhYl9zdHlsZShzdHlsZSA9IGxpc3QoY2VsbF9maWxsKGNvbG9yID0gImxpZ2h0Ymx1ZSIpKSwgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zPUZsdVZhYykpCmBgYAoKU2ltaWxhcmx5LCBmcm9tIHN1bW1hcnkgVGFibGUgMy4zLjIgYWJvdmUgd2UgZm91bmQgdGhhdCB0aGUgdmFyaWFibGUgRGlyZWN0Q29udGFjdCB0aGF0IHNob3dlZCB3aGV0aGVyIHRoZSBwYXJ0aWNpcGFudCBoYWQgZGlyZWN0ZWQgY29udGFjdCB3aXRoIHBlb3BsZSBvciBub3QgYWxzbyBoYWQgYW4gdW5wcm9taXNpbmcgcC12YWx1ZT0wLjA1My4gQWZ0ZXIgcmVtb3ZpbmcgdGhlIEZsdVZhYyB2YXJpYWJsZSBmaXJzdCwgd2UgY29tcGFyZWQgdGhlIG1vZGVscyB3aXRoIGFuZCB3aXRob3V0IERpcmVjdENvbnRhY3QgdmFyaWFibGUgdXNpbmcgdGhlIGRldmlhbmNlLiBGcm9tIHRoZSBmb2xsb3dpbmcgc3VtbWFyeSBUYWJsZSAzLjMuNCBvbmUgY2FuIHNlZSB0aGF0IHRoZSBwLXZhbHVlIG9mIHRoZSBDaGktc3F1YXJlZCBzdGF0aXN0aWMgd2FzIDAuMDg1LCBzdWdnZXN0aW5nIGFnYWluIHRoYXQgd2UgZGlkIG5vdCBoYXZlIGEgY29uY2x1c2lvbiB3aGV0aGVyIG9yIG5vdCB0aGVyZSB3YXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgQ09WSUQgc3RhdHVzIGFuZCBoYXZpbmcgZGlyZWN0IGNvbnRhY3Qgd2l0aCBwZW9wbGUuCgpgYGB7cn0KZml0MTwtZ2xtKHl+RGlyZWN0Q29udGFjdCtWYWNjaW5lU3RhdHVzK0FudGlCb2R5UmVzdWx0LCBkYXRhPVh5LCBmYW1pbHkgPSAiYmlub21pYWwiKQpmaXQyPC1nbG0oeX5WYWNjaW5lU3RhdHVzK0FudGlCb2R5UmVzdWx0LCBkYXRhPVh5LCBmYW1pbHkgPSAiYmlub21pYWwiKQp0YmxzPC1hbm92YShmaXQxLCBmaXQyLCB0ZXN0PSJMUlQiKQpub3Rlczwtc3Ryc3BsaXQoYXR0cih0YmxzLCAiaGVhZGluZyIpWzJdLCAiXG4iKQp0YmxzJT4lc3RhcmdhemVyKHR5cGUgPSAidGV4dCIsIHRpdGxlPSJUYWJsZSAzLjMuNDogVmFsaWRhdGlvbiBvZiBEaXJlY3RDb250YWN0IFZhcmlhYmxlIixub3Rlcz1ub3Rlc1tbMV1dLHN1bW1hcnk9RkFMU0UpCmBgYAoKV2UgYWdhaW4gZHJvcHBlZCB0aGUgdmFyaWFibGUgRGlyZWN0Q29udGFjdCBiZWNhdXNlIHRoZSBBSUMgZGlkbid0IGNoYW5nZSBzaWduaWZpY2FudGx5IGFmdGVyIHJlbW92YWw6CmBgYHtyfQpNb2RlbHMkU3Vic2V0c1szOjQsXSU+JWd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMy4zLjU6IE1vZGVsIEFJQyBDb21wYXJpc29uIHdpdGggRGlyZWN0Q29udGFjdCBSZW1vdmVkIiklPiV0YWJfb3B0aW9ucyhjb250YWluZXIud2lkdGggPSAxNDAwLCB0YWJsZS5hbGlnbj0ibGVmdCIpJT4lCiAgdGFiX3N0eWxlKHN0eWxlID0gbGlzdChjZWxsX2ZpbGwoY29sb3IgPSAibGlnaHRibHVlIikpLCBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnM9RGlyZWN0Q29udGFjdCkpCmBgYAoKVGhlcmVmb3JlLCB3ZSBjb25jbHVkZWQgdGhhdCBvdXIgbW9kZWwgd2FzOgpcYmVnaW57ZXF1YXRpb24qfQpcbG57KFxmcmFje3BfaX17MS1wX2l9KX0gPSAtNS41NjUgLTQuNTY4IFx0aW1lcyBcdGV4dHtWYWNjaW5lU3RhdHVzWWVzfV9pICszLjM5MiBcdGltZXMgXHRleHR7QW50aUJvZHlSZXN1bHRJbmRldGVybWluYXRlfV9pICs2LjYwMiBcdGltZXMgXHRleHR7QW50aUJvZHlSZXN1bHRQb3NpdGl2ZX1faQpcZW5ke2VxdWF0aW9uKn0KCmZyb20gdGhlIGZvbGxvd2luZyBzdW1tYXJ5IFRhYmxlIDMuMy42OgpgYGB7cn0KZml0MiU+JXN0YXJnYXplcih0eXBlID0gInRleHQiLCB0aXRsZT0iVGFibGUgMy4zLjY6IFN1bW1hcnkgb2YgRmluYWwgTW9kZWwiLCBkZXAudmFyLmxhYmVscyA9IGMoIkNvdmlkXFxfU3RhdHVzIiksIHJlcG9ydD0oInZjKnMqcCIpKQpgYGAKCldlIGZ1cnRoZXIgZGlkIGFub3RoZXIgbW9kZWwgZXN0aW1hdGlvbiBmb3IgdGhlIENPVklEIHN0YXR1cyBhbmQgc29tZSBwcmV2ZW50YXRpdmUgYmVoYXZpb3VycyBsaWtlIHdhc2hpbmcgaGFuZHMsIHdlYXJpbmcgbWFza3MsIGtlZXAgMiBtZXRyZXMgYW5kIGF2b2lkaW5nIGNyb3dkcy4gVGhlIHJlc3VsdCBpbiBzdW1tYXJ5IFRhYmxlIDMuMy43IHNob3dlZCB0aGF0IG9ubHkgd2FzaGluZyBoYW5kcyBvZnRlbiBhbiBhbHdheXMgd2VyZSBzaWduaWZpY2FudCBlbm91Z2ggdG8gYmUgbmVnYXRpdmVseSByZWxhdGVkIHRvIHRoZSBDT1ZJRCBzdGF0dXMgd2hlcmVhcyBhbGwgb3RoZXIgY292YXJpYXRlcyB3ZXJlIGluY29uY2x1c2l2ZS4KCmBgYHtyfQpYeTI8LVJlZ3Jlc3Npb25EYXRhJT4lc2VsZWN0KENvdmlkX1N0YXR1cywgV2FzaEhhbmQsIFdlYXJNYXNrLCBLZWVwMm0sIEF2b2lkQ3Jvd2RzKSU+JW5hLm9taXQoKQpnbG0oQ292aWRfU3RhdHVzfldhc2hIYW5kK1dlYXJNYXNrK0tlZXAybStBdm9pZENyb3dkcywgZGF0YT1YeTIsIGZhbWlseSA9ICJiaW5vbWlhbCIpJT4lCiAgc3RhcmdhemVyKHR5cGUgPSAidGV4dCIsIHRpdGxlPSJUYWJsZSAzLjMuNzogTW9kZWwgRXN0aW1hdGVzIG9mIENPVklEIFN0YXR1cyB3aXRoIFByZXZlbnRhdGl2ZSBCZWhhdmlvdXJzIixkZXAudmFyLmxhYmVscyA9IGMoIkNvdmlkXFxfU3RhdHVzIiksIHJlcG9ydD0oInZjKnMqcCIpKQpgYGAKCiMgRGlzY3Vzc2lvbgoKIyMgTW9ydGFsaXR5CkZyb20gU2VjdGlvbiAzLjEsIHdlIGZvdW5kIHRoYXQgdGhlIHByb2JhYmlsaXR5IG9mIGRlYXRoIGNhdXNlZCBieSBDT1ZJRC0xOSBpcyBub3QgaG9tb2dlbmVvdXMgYWNyb3NzIHllYXJzLCB0aGVuIHdlIGNvbXB1dGVkIHRoZSByZWxhdGl2ZSByaXNrcyBhbmQgb2RkcyByYXRpb3MgZm9yIDIwMjEsMjAyMiBhbmQgMjAyMy4gV2Ugb2JzZXJ2ZWQgdGhhdCByZWxhdGl2ZSByaXNrIGluIDIwMjIgKFJSID0gMS4xNzE0KSBpbmRpY2F0ZXMgYSBoaWdoZXIgcmlzayBjb21wYXJlZCB0byB0aGUgMjAyMCwgd2hpbGUgcmVsYXRpdmUgcmlzayBpbiAyMDIxIChSUiA9IDAuOTQ0OSkgc3VnZ2VzdHMgYSBzbGlnaHRseSBsb3dlciByaXNrLiBOb3RhYmx5LCByZWxhdGl2ZSByaXNrIGluIDIwMjMgKFJSID0gMC40NzE0KSBzdGFuZHMgb3V0IHdpdGggYSBzaWduaWZpY2FudGx5IGxvd2VyIHJpc2ssIHN1Z2dlc3RpbmcgYSBwb3RlbnRpYWwgcHJvdGVjdGl2ZSBlZmZlY3QuIFRoZSBvZGRzIHJhdGlvIGluIDIwMjMgKE9SID0gMi4xNzkpIHN0YW5kcyBvdXQsIGluZGljYXRpbmcgYSBzaWduaWZpY2FudGx5IGhpZ2hlciBvZGRzIGNvbXBhcmVkIHRvIHRoZSBvZGRzIGluIDIwMjAuIEluIGNvbnRyYXN0LCBvZGRzIHJhdGlvIGluIDIwMjIgKE9SID0gMC44NDYxKSBzdWdnZXN0cyBhIGxvd2VyIG9kZHMsIHdoaWxlIG9kZHMgcmF0aW8gaW4gMjAyMSAoT1IgPSAxLjA2MTMpIGRlbW9uc3RyYXRlcyBhIHN1YnRsZSBpbmNyZWFzZS4KClRoZSBsb3dlciByaXNrIGFuZCBoaWdoZXIgb2RkcyBpbiAyMDIxIGFuZCAyMDIzIG1pZ2h0IGJlY2F1c2UgdGhlIHdpZGVzcHJlYWQgdmFjY2luYXRpb24gaW4gQ2FuYWRhLiBQdWJsaWMgSGVhbHRoIE9udGFyaW8gc3RhdGVzW0BQSE9dIHRoYXQgb3ZlciA3MC4yJSBvZiBPbnRhcmlvIHJlc2lkZW50cyByZWNlaXZlZCBhdCBsZWFzdCBvbmUgZG9zZSBvZiBDT1ZJRC0xOSB2YWNjaW5lIGluIHRoZSBmdWxsIHllYXIgMjAyMSwgb3ZlciA2MCUgY29tcGxldGVkIHR3byBkb3NlcyB2YWNjaW5hdGlvbi4gQWxzbywgdGhlIHZhY2NpbmUgc3RpbGwgaGFzIGhpZ2ggdmFjY2luZSBlZmZlY3RpdmVuZXNzIGFnYWluc3QgdmFyaWFudHMgb2YgY29uY2VybiBBbHBoYSBhbmQgZGVsdGEuIFRpbGwgT2N0b2JlciAyMDIzLCA4MC41JSBwZW9wbGUgaW4gdG90YWwgcG9wdWxhdGlvbiBpbiBDYW5hZGEgY29tcGxldGVkIHRoZWlyIHByaW1hcnkgc2VyaWVzIHZhY2NpbmF0aW9uLCBvdmVyIDQgbWlsbGlvbiBwZW9wbGUgcmVjZWl2ZWQgYm9vc3RlciBkb3NlICBQZml6ZXItQmlvTlRlY2ggQ29taXJuYXR5IHZhY2NpbmVbQFZDXS4gVGhlIHB1YmxpYyBoZWFsdGggcmVzdHJpY3Rpb25zIGFuZCBtYW5kYXRvcnkgbWFza2luZyBwb2xpY2llcyBkcm9wcGVkLCB0aGVyZSBoYXMgYWxzbyBiZWVuIGEgc2hpZnQgZnJvbSB0aGUgeW91bmcgdG8gdGhlIG9sZCwgd2l0aCBtb3JlIHRoYW4gODAlIG9mIGRlYXRocyBvY2N1cnJpbmcgaW4gcGF0aWVudHMgb3ZlciA2NSB5ZWFycyBvbGQgd2l0aCBjb21vcmJpZGl0aWVzW0BDQkNdLgoKIyMgTG9uZy10ZXJtIEltcGFjdAoKQmFzZWQgb24gdGhlIHJlc3VsdHMgZnJvbSBzZWN0aW9uIDMuMiwgVGhlIENoaS1zcXVhcmVkIHRlc3RzIHJldmVhbGVkIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb25zIGJldHdlZW4gYWdlIGdyb3VwcyBhbmQgdGhlIG9jY3VycmVuY2Ugb2YgbG9uZy10ZXJtIENPVklELTE5IHN5bXB0b21zIHdpdGhpbiBlYWNoIHNleCBjYXRlZ29yeSBhbmQgYmV0d2VlbiBzZXhlcyB3aXRoaW4gZWFjaCBhZ2UgZ3JvdXAuIFRoZSBPZGRzIFJhdGlvcyBjb25zaXN0ZW50bHkgc2hvd2VkIHRoYXQgZmVtYWxlcyBhcmUgbW9yZSBsaWtlbHkgdGhhbiBtYWxlcyB0byByZXBvcnQgbG9uZy10ZXJtIENPVklELTE5IHN5bXB0b21zIGluIGFsbCBhZ2UgZ3JvdXBzLlRoaXMgZGlzcGFyaXR5IGluIHRoZSBsaWtlbGlob29kIG9mIHN5bXB0b21zIGFwcGVhcnMgdG8gaW5jcmVhc2Ugd2l0aCBhZ2UsIHdpdGggdGhlIG9sZGVzdCBhZ2UgZ3JvdXAgKEFnZXMgNjUgYW5kIG92ZXIpIHNob3dpbmcgdGhlIGhpZ2hlc3QgT2RkcyBSYXRpby4KCk91ciBmaW5kaW5ncyByZXNvbmF0ZSB3aXRoIHNldmVyYWwgY2xpbmljYWwgc3R1ZGllcyB0aGF0IGhhdmUgc3VnZ2VzdGVkIGdlbmRlciBkaWZmZXJlbmNlIGluIHRoZSBpbXBhY3Qgb2YgbG9uZ19DT1ZJRC0xOSBzeW5kcm9tZS5TcGVjaWZpY2FsbHksIHRoZSBoaWdoZXIgbGlrZWxpaG9vZCBvZiBsb25nLXRlcm0gc3ltcHRvbXMgaW4gZmVtYWxlcyBpcyBjb25zaXN0ZW50IHdpdGggcHVibGljIGhlYWx0aCByZXNlYXJjaGVzIHRoYXQgd29tZW4gbWlnaHQgZXhwZXJpZW5jZSBDT1ZJRC0xOSBkaWZmZXJlbnRseSB0aGFuIG1lbi5bQEJhaTIwMjEtdmJdIEhvd2V2ZXIgb3VyIHN0dWR5IGlzIGJhc2VkIG9uIGFnZ3JlZ2F0ZWQgZGF0YSBmb2N1c2luZyBwcmltYXJpbHkgb24gdGhlIGFzc29jaWF0aW9uIG9mIHNleCBhbmQgYWdlIHdpdGggbG9uZy10ZXJtIENPVklELTE5IHN5bXB0b21zLiBXaGlsZSB0aGlzIHByb3ZpZGVzIHZhbHVhYmxlIGluc2lnaHRzLCB0aGUgZGF0YSBkb2VzIG5vdCBpbmNsdWRlIGluZGl2aWR1YWwgcGF0aWVudCBzdGF0ZXMgdGhhdCBjb3VsZCBpbmZsdWVuY2UgdGhlIGZpbmRpbmdzLiBNb3Jlb3ZlciwgVGhlIG5hdHVyZSBvZiB0aGUgZGF0YSBhbmQgdGhlIGFuYWx5dGljYWwgbWV0aG9kcyB1c2VkIChDaGktc3F1YXJlZCB0ZXN0cyBhbmQgT2RkcyBSYXRpb3MpIGFyZSBlZmZlY3RpdmUgZm9yIGlkZW50aWZ5aW5nIGFzc29jaWF0aW9ucyBidXQgZG8gbm90IGVzdGFibGlzaCBjYXVzYXRpb24uIAoKRnVydGhlciBzdHVkaWVzIGludm9sdmluZyBtb3JlIGRldGFpbGVkIGRhdGEgc2hvdWxkIGFpbSB0byB1bmNvdmVyIHRoZSBiaW9sb2dpY2FsLCBzb2NpYWwsIGFuZCBiZWhhdmlvcmFsIG1lY2hhbmlzbXMgZHJpdmluZyB0aGUgb2JzZXJ2ZWQgZ2VuZGVyIGRpZmZlcmVuY2VzIGluIGxvbmctdGVybSBDT1ZJRC0xOSBzeW1wdG9tcy4gU29tZSBzdHVkeVtASnVzemtvMjAyMi1vcV0gc3VnZ2VzdHMgdGhhdCBwc3ljaG9sb2dpY2FsIGZhY3RvcnMgYWxzbyBoYXZlIGNvcnJlbGF0aW9uIGluIGJvdGggd29tZW4gYW5kIG1lbiB3aXRoIHNlbGYtcmVwb3J0ZWQgaGVhbHRoIGFmdGVyIENPVklELTE5LiBUaGUgc3R1ZHkgY2xlYXJseSBpbmRpY2F0ZXMgYSBzaWduaWZpY2FudCBnZW5kZXIgZGlzcGFyaXR5IGluIHRoZSBtZW50YWwgaGVhbHRoIGltcGFjdCBvZiBDT1ZJRC0xOSBkdXJpbmcgdGhlIHJlY3VwZXJhdGlvbiBwZXJpb2QuCgojIyBQcmV2YWxlbmNlIE1vZGVsaW5nCgpGcm9tIFNlY3Rpb24gMy4zIHdlIGhhdmUgZm91bmQgdGhhdCB0aGUgb2RkcyByYXRpbyBvZiBDT1ZJRC0xOSB3YXMgcmVsYXRlZCB0byB0d28gY292YXJpYXRlczogdGhlIHZhY2NpbmF0aW9uIHN0YXR1cyBhbmQgdGhlIGFudGlib2R5IHByZXNlbnRlZCBpbiBibG9vZC4gU3BlY2lmaWNhbGx5LCB3ZSBpbnRlcnByZXRlZCB0aGUgY29lZmZpY2llbnRzIGFzIHRoZSBsb2ctb2RkcyBmb3IgaXRzIGNvcnJlc3BvbmRpbmcgY292YXJpYXRlLiAKCiQkClxsbntPUn09XGJldGFfaiwgXHF1YWQgT1I6PVxmcmFje3BfMigxLXBfMSl9e3BfMSgxLXBfMil9CiQkCgpJbiBvdGhlciB3b3JkcywgJGVee1xiZXRhX2p9JCBpcyB0aGUgbWFyZ2luYWwgaW5jcmVhc2UvZGVjcmVhc2UgaW4gdGhlIG9kZHMgZm9yIGEgb24tdW5pdCBpbmNyZWFzZS9kZWNyZWFzZSBpbiB0aGUgY292YXJpYXRlLCBhc3N1bWluZyBhbGwgb3RoZXIgY292YXJpYXRlcyBoZWxkIGNvbnN0YW50LiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGNvbnN0YW50IGNvZWZmaWNpZW50ICRcYmV0YV8wJCBpcyBpbnRlcnByZXRlZCBhcyB0aGUgbG9nLW9kZHMgJFxsbnsoXGZyYWN7cF8xfXsxLXBfMX0pfSQgd2l0aCBhbGwgY292YXJpYXRlcyB1bmNoYW5nZWQuIEZyb20gb3VyIHN1bW1hcnkgVGFibGUgMy4zLjYgb25lIGNhbiBzZWUgdGhhdCB0aGUgY29lZmZpY2llbnQgZm9yIHRoZSB2YWNjaW5lIHN0YXR1cyB3YXMgbmVnYXRpdmUsIGluZGljYXRpbmcgdGhhdCB0aGUgb2RkcyBvZiBoYXZpbmcgYSBwb3NpdGl2ZSBDT1ZJRCB0ZXN0IGRlY3JlYXNlcyBpZiB2YWNjaW5lIHdhcyBnaXZlbi4gVGhpcyByZXN1bHQgd2Fzbid0IHN1cnByaXNpbmcgdGhhdCB0aGUgdXNlIG9mIHZhY2NpbmVzIGhhcyBzbyBmYXIgaGVscGVkIHRoZSBodW1hbml0eSBjb21iYXQgdGhpcyB2aXJ1cy4gVGhlIGNvZWZmaWNpZW50IGZvciB0aGUgaW5kZXRlcm1pbmF0ZSBhbnRpYm9keSByZXN1bHQgd2FzIHBvc2l0aXZlLCBhbmQgdGhlIG9uZSBmb3IgdGhlIHBvc2l0aXZlIGFudGlib2R5IHJlc3VsdCB3YXMgZXZlbiBoaWdoZXIuIFdlIG11c3QgcG9pbnQgb3V0IHRoYXQgb25lIG5lZWRzIHRvIGNhcmVmdWxseSBpbnRlcnByZXQgdGhpcyByZXN1bHQuIEl0IG1lYW50IHRoYXQgdGhlIG9kZHMgb2YgZ2V0dGluZyBhIHBvc2l0aXZlIENPVklEIHRlc3QgaXMgcG9zaXRpdmVseSBjb3JyZWxhdGVkIHdpdGggdGhlIHJlc3VsdCBvZiBhbiBhbnRpYm9keSB0ZXN0LiBUaGUgbW9yZSBwb3NpdGl2ZSB0aGUgYW50aWJvZHkgdGVzdCBpcywgdGhlIGhpZ2hlciB0aGUgb2RkcyBvZiBoYXZpbmcgYSBwb3NpdGl2ZSBDT1ZJRCB0ZXN0IGFzIHdlbGwuIEhvd2V2ZXIsIGFudGlib2R5IHRlc3QgYW5kIHRoZSBDT1ZJRC0xOSBkaWFnbm9zdGljIHRlc3QgYXJlIG5vdCB0aGUgc2FtZSB0aGluZyBpbiB0aGUgZXhwbGFpbmF0aW9ucyBwcm92aWRlZCBieSBGREEgW0BBbnRpYm9keV0uIFRoZSBhbnRpYm9keSB0ZXN0IGRvZXMgbm90IGRldGVjdCB0aGUgdmlydXMuIFJhdGhlciwgaXQgbWVyZWx5IHRlbGxzIGlmIGEgcGVyc29uIG1heSBoYXZlIGhhZCBhIFBSSU9SIGluZmVjdGlvbiwgdGh1cyBpdCBkb2VzIG5vdCByZWZsZWN0IGlmIHRoZSBwZXJzb24gaXMgY3VycmVudGx5IGluZmVjdGVkIG9yIG5vdC4gSW4gYWRkaXRpb24sIHRoZSBhbnRpYm9keSB0ZXN0IGNvdWxkIHNob3cgaWYgYSBwZXJzb24gaGFzIGJlZW4gdmFjY2luYXRlZCBvciBub3QsIGJ1dCBpbiBnZW5lcmFsIGFuIGFudGlib2R5IHRlc3QgbWF5IG5vdCBkZXRlY3QgdGhlIGtpbmQgb2YgYW50aWJvZGllcyBjcmVhdGVkIGJ5IHZhY2NpbmVzLCB0aGVyZWZvcmUgaXQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiBhbnRpYm9keSB0ZXN0IHBlcmZvcm1lZC4gRnJvbSBvdXIgcmVzdWx0IHdlIHdlcmUgb25seSBhYmxlIHRvIHNheSB0aGF0IHRoZXJlIHdhcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBDT1ZJRCBkaWFnbm9zdGljIHRlc3QgYW5kIHRoZSBhbnRpYm9keSB0ZXN0LCB3aGljaCB3YXMgbm90IHN1cnByaXNpbmcgYmVjYXVzZSBpbiBvcmRlciB0byBzaG93IHBvc2l0aXZlIGluIGFuIGFudGlib2R5IHRlc3QsIG9uZSBtdXN0IGhhdmUgaGFkIENPVklEIHRvIGJlZ2luIHdpdGguIFRoaXMgaW5mb3JtYXRpb24gbWF5IGJlIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHRoYXQgb25lIG9mIHRoZSB0ZXN0cyBpcyBlY29ub21pY2FsbHkgbW9yZSBhZmZvcmRhYmxlIGFuZCBjYW4gYmUgdXNlZCBhcyBhIHByZWxpbWluYXJ5IHNjcmVlbmluZyBtZXRob2QuCgpGcm9tIHRoZSBzZWNvbmQgbW9kZWwgZml0dGluZyBmb3IgcHJldmVudGF0aXZlIGJlaGF2aW91cnMsIHdlIGZvdW5kIHRoYXQgb25seSB3YXNoaW5nIGhhbmQgd2FzIHNob3dpbmcgYSBuZWdhdGl2ZSBlZmZlY3Qgb24gdGhlIG9kZHMgb2YgZ2V0dGluZyBDT1ZJRC4gV2Ugd2VyZW4ndCBhYmxlIHRvIGRyYXcgYW55IGNvbmNsdXNpb24gZm9yIG90aGVyIHByZXZlbnRhdGl2ZSBiZWhhdmlvdXJzLCBidXQgd2UgdGhvdWdodCBpdCB3YXMgaW5ldml0YWJseSBoYXJkIHRvIGZpbmQgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgQ09WSUQgc3RhdHVzIGFuZCB0aG9zZSBiZWhhdmlvdXJzIGJlY2F1c2UgcGVvcGxlIG1heSBub3QgYW5zd2VyIHRoZSBxdWVzdGlvbm5haXJlIGFjY3VyYXRlbHkuIFBlb3BsZSBtaWdodCBmaW5kIGRpZmZpY3VsdCB0byBkaXN0aW5ndWlzaCB0aGUgYm91bmRhcnkgYmV0d2VlbiB3ZWFyaW5nIG1hc2sgb2Z0ZW4gYW5kIGFsd2F5cy4gUGVvcGxlIGNhbiBldmVuIGZhbHNlbHkgYW5zd2VyIHRoYXQgdGhleSBrZWVwIGEgZGlzdGFuY2Ugb2YgMiBtZXRyZXMgb3IgbW9yZSBidXQgaW4gcmVhbGl0eSB0aGV5IGhhdmUgbm90IGRvbmUgc28uIFRoZSByZXN1bHRpbmcgYW5zd2VycyBmb3IgdGhlIHN1cnZleSB0aGVyZWZvcmUgbWF5IG5vdCBiZSBhcyByZWxpYWJsZS4gVGh1cyB3ZSB0aG91Z2h0IGl0IGlzIGdlbmVyYWxseSBkaWZmaWN1bHQgdG8gYWNjdXJhdGVseSBkZXNjcmliZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcHJldmFsZW5jZSBvZiBkaXNlYXNlIGFuZCBwcmV2ZW50YXRpdmUgYmVoYXZpb3VyLiBSZXNlYXJjaGVycyBoYXZlIHRvIGRlc2lnbiBleHBlcmltZW50cyBhbmQgZmluZCB3YXlzIHRvIHF1YW50aWZ5IHRoZSBiZWhhdmlvdXIgaW4gb3JkZXIgdG8gaGF2ZSBtb3JlIHJlbGlhYmxlIG91dGNvbWVzLiAKCiMgQ29uY2x1c2lvbgpJbiBNb3J0YWxpdHkgc2VjdGlvbiwgd2UgZm91bmQgdGhhdCB0aGVyZSBleGlzdCBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluICBwcm9iYWJpbGl0eSBvZiBkZWF0aCBjYXVzZWQgYnkgQ09WSUQtMTkgYWNyb3NzIHllYXJzLiAyMDIyIGhhcyB0aGUgcmVsYXRpdmUgcmlzayBncmVhdGVyIHRoYW4gMSBhbmQgb2RkcyByYXRpbyBsZXNzIHRoYW4gMSwgd2hpY2ggaW5kaWNhdGUgdGhlIG5lZ2F0aXZlIGFzc29jaWF0aW9uLCBpbmRpY2F0aW5nIGFuIGRlY3JlYXNlZCBsaWtlbGlob29kIG9mIHRoZSBpbiBwcm9iYWJpbGl0eSBpbiBDT1ZJRC0xOSBkZWF0aCBpbiB0aGVzZSB5ZWFycy5HaXZlbiB0aGUgY2hhbmdlIGluIHRoZSBkZW1vZ3JhcGhpYyBvZiB0aGUgYWZmZWN0ZWQgcG9wdWxhdGlvbiwgaXQgaXMgZXNzZW50aWFsIHRvIGFja25vd2xlZGdlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSByaXNlIGluIG1vcnRhbGl0eSBhbW9uZyBvbGRlciBpbmRpdmlkdWFscyBpbiB0aGUgbGF0ZXIgc3RhZ2VzIG9mIHRoZSBlcGlkZW1pYyBjb3VsZCBiZSBhdHRyaWJ1dGVkIHRvIGNvbXBsaWNhdGlvbnMgcmF0aGVyIHRoYW4gdGhlIGRpcmVjdCBpbXBhY3Qgb2YgQ09WSUQtMTkgaXRzZWxmLiBJbiBmdXR1cmUgcmVzZWFyY2gsIGl0IHdvdWxkIGJlIHZhbHVhYmxlIHRvIGV4cGxvcmUgdGhlIGluZmx1ZW5jZSBvZiBjb21wbGljYXRpb25zIG9uIHRoZSBkZWF0aCBhZnRlciBpbmZlY3Rpb25zLgoKd2UgY2FuIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGFnZSBhbmQgZ2VuZGVyIHdpdGggdGhlIG9jY3VycmVuY2Ugb2YgbG9uZy10ZXJtIENPVklELTE5IHN5bXB0b21zLiBOb3RhYmx5LCBmZW1hbGVzIGFjcm9zcyBhbGwgYWdlIGdyb3VwcywgZXNwZWNpYWxseSB0aG9zZSBhZ2VkIDY1IGFuZCBvdmVyLCBhcmUgbW9yZSBsaWtlbHkgdG8gcmVwb3J0IHRoZXNlIHN5bXB0b21zIGNvbXBhcmVkIHRvIG1hbGVzLkhvd2V2ZXIsIGl0J3MgaW1wb3J0YW50IHRvIHJlY29nbml6ZSB0aGF0IG91ciBzdHVkeSwgd2hpbGUgaGlnaGxpZ2h0aW5nIGNydWNpYWwgYXNzb2NpYXRpb25zLCBkb2VzIG5vdCBkZWx2ZSBpbnRvIHRoZSBjYXVzYWwgbWVjaGFuaXNtcyBkdWUgdG8gaXRzIHJlbGlhbmNlIG9uIGFnZ3JlZ2F0ZWQgZGF0YS4gVGhpcyBsaW1pdGF0aW9uIHVuZGVyc2NvcmVzIHRoZSBuZWVkIGZvciBmdXJ0aGVyIHJlc2VhcmNoIHdpdGggbW9yZSBjb21wcmVoZW5zaXZlIGRhdGEgdG8gZXhwbG9yZSB0aGUgdW5kZXJseWluZyBiaW9sb2dpY2FsLCBzb2NpYWwsIGFuZCBwc3ljaG9sb2dpY2FsIGZhY3RvcnMgY29udHJpYnV0aW5nIHRvIHRoZXNlIG9ic2VydmVkIGRpZmZlcmVuY2VzIGluIGxvbmctdGVybSBDT1ZJRC0xOSBzeW1wdG9tcy4KCldlIGZvdW5kIGluIFByZXZhbGVuY2UgTW9kZWxpbmcgc2VjdGlvbiB0aGF0IHRoZSBDT1ZJRCBzdGF0dXMgaXMgbmVnYXRpdmVseSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhY2NpbmF0aW9uIHN0YXR1cywgaW5kaWNhdGluZyB0aGF0IHZhY2NpbmVzIHdhcyBhIHNpZ25pZmljYW50IGZhY3RvciB0byBsb3dlciB0aGUgcHJldmFsZW5jZSBvZiB0aGUgdmlydXMuIFdlIGFsc28gZm91bmQgYnV0IG5vdCBzdXJwcmlzaW5nIHRoYXQgdGhlIGFudGlib2R5IHRlc3QgcmVzdWx0IHdhcyBwb3NpdGl2ZWx5IHJlbGF0ZWQgdG8gdGhlIENPVklEIHN0YXR1cy4gSW4gYWRkaXRpb24sIHdlIGRpZCBjb25maXJtIHRoYXQgd2FzaGluZyBoYW5kcyBjYW4gcmVzdWx0IGluIGEgbmVnYXRpdmUgaW5mbHVlbmNlIG9uIHRoZSBwcmV2YWxlbmNlIG9mIENPVklELCBidXQgd2UgY291bGQgbm90IGZpbmQgdGhlIHNhbWUgY29uY2x1c2lvbiBmb3Igb3RoZXIgcHJldmVudGF0aXZlIGJlaGF2aW91cnMuCgojIFJlZmVyZW5jZXMK